-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
fail_safe.cr
69 lines (55 loc) · 1.4 KB
/
fail_safe.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Provides a way to parse a YAML document according to the
# fail-safe schema, as specified in http://www.yaml.org/spec/1.2/spec.html#id2802346,
# where all scalar values are considered strings.
module YAML::Schema::FailSafe
# Deserializes a YAML document.
def self.parse(data : String | IO) : Any
Parser.new data, &.parse
end
# Deserializes multiple YAML documents.
def self.parse_all(data : String | IO) : Array(Any)
Parser.new data, &.parse_all
end
# :nodoc:
class Parser < YAML::Parser
@anchors = {} of String => Any
def put_anchor(anchor, value)
@anchors[anchor] = value
end
def get_anchor(anchor)
@anchors.fetch(anchor) do
@pull_parser.raise("Unknown anchor '#{anchor}'")
end
end
def new_documents
[] of Any
end
def new_document
Any.new([] of Any)
end
def cast_document(doc)
doc[0]? || Any.new(nil)
end
def new_sequence
Any.new([] of Any)
end
def new_mapping
Any.new({} of Any => Any)
end
def new_scalar
Any.new(@pull_parser.value)
end
def add_to_documents(documents, document)
documents << document
end
def add_to_document(document, node)
document.as_a << node
end
def add_to_sequence(sequence, node)
sequence.as_a << node
end
def add_to_mapping(mapping, key, value)
mapping.as_h[key] = value
end
end
end