Class: Json::Merge::NodeWrapper
- Inherits:
-
Ast::Merge::NodeWrapperBase
- Object
- Ast::Merge::NodeWrapperBase
- Json::Merge::NodeWrapper
- Defined in:
- lib/json/merge/node_wrapper.rb
Overview
Wraps TreeHaver nodes with line information and signatures for JSON / JSONC merging.
Instance Attribute Summary collapse
-
#dialect ⇒ Object
readonly
Returns the value of attribute dialect.
Instance Method Summary collapse
- #array? ⇒ Boolean
- #boolean? ⇒ Boolean
- #closing_bracket ⇒ Object
- #closing_line ⇒ Object
- #comment? ⇒ Boolean
- #container? ⇒ Boolean
- #elements ⇒ Object
- #find_child_by_field(field_name) ⇒ Object
- #find_child_by_type(type_name) ⇒ Object
-
#initialize(node, lines:, source: nil, dialect: :jsonc, **options) ⇒ NodeWrapper
constructor
A new instance of NodeWrapper.
- #key_name ⇒ Object
- #mergeable_children ⇒ Object
- #null? ⇒ Boolean
- #number? ⇒ Boolean
- #object? ⇒ Boolean
- #opening_bracket ⇒ Object
- #opening_line ⇒ Object
- #pair? ⇒ Boolean
- #pairs ⇒ Object
- #root_level_container? ⇒ Boolean
- #semantic_children ⇒ Object
- #string? ⇒ Boolean
- #value_node ⇒ Object
Constructor Details
#initialize(node, lines:, source: nil, dialect: :jsonc, **options) ⇒ NodeWrapper
Returns a new instance of NodeWrapper.
10 11 12 13 |
# File 'lib/json/merge/node_wrapper.rb', line 10 def initialize(node, lines:, source: nil, dialect: :jsonc, **) @dialect = dialect.to_sym super(node, lines: lines, source: source, **) end |
Instance Attribute Details
#dialect ⇒ Object (readonly)
Returns the value of attribute dialect.
8 9 10 |
# File 'lib/json/merge/node_wrapper.rb', line 8 def dialect @dialect end |
Instance Method Details
#array? ⇒ Boolean
19 20 21 |
# File 'lib/json/merge/node_wrapper.rb', line 19 def array? @node.type.to_s == 'array' end |
#boolean? ⇒ Boolean
31 32 33 |
# File 'lib/json/merge/node_wrapper.rb', line 31 def boolean? %w[true false].include?(@node.type.to_s) end |
#closing_bracket ⇒ Object
141 142 143 144 145 146 |
# File 'lib/json/merge/node_wrapper.rb', line 141 def closing_bracket return '}' if object? return ']' if array? nil end |
#closing_line ⇒ Object
126 127 128 129 130 131 132 |
# File 'lib/json/merge/node_wrapper.rb', line 126 def closing_line return unless container? && @end_line return closing_bracket if @start_line == @end_line @lines[@end_line - 1] end |
#comment? ⇒ Boolean
43 44 45 |
# File 'lib/json/merge/node_wrapper.rb', line 43 def comment? @node.type.to_s == 'comment' end |
#container? ⇒ Boolean
105 106 107 |
# File 'lib/json/merge/node_wrapper.rb', line 105 def container? object? || array? end |
#elements ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/json/merge/node_wrapper.rb', line 78 def elements return [] unless array? result = [] @node.each do |child| child_type = child.type.to_s next if child_type == 'comment' next if child_type == ',' next if child_type == '[' next if child_type == ']' result << NodeWrapper.new(child, lines: @lines, source: @source, dialect: dialect) end result end |
#find_child_by_field(field_name) ⇒ Object
148 149 150 151 152 |
# File 'lib/json/merge/node_wrapper.rb', line 148 def find_child_by_field(field_name) return unless @node.respond_to?(:child_by_field_name) @node.child_by_field_name(field_name) end |
#find_child_by_type(type_name) ⇒ Object
154 155 156 157 158 159 160 161 |
# File 'lib/json/merge/node_wrapper.rb', line 154 def find_child_by_type(type_name) return unless @node.respond_to?(:each) @node.each do |child| return child if child.type.to_s == type_name end nil end |
#key_name ⇒ Object
47 48 49 50 51 52 53 54 |
# File 'lib/json/merge/node_wrapper.rb', line 47 def key_name return unless pair? key_node = find_child_by_field('key') || semantic_children.first return unless key_node Json::Merge.object_key_for_literal(node_text(key_node), dialect: dialect) end |
#mergeable_children ⇒ Object
94 95 96 97 98 99 100 101 102 103 |
# File 'lib/json/merge/node_wrapper.rb', line 94 def mergeable_children case type when :object pairs when :array elements else [] end end |
#null? ⇒ Boolean
35 36 37 |
# File 'lib/json/merge/node_wrapper.rb', line 35 def null? @node.type.to_s == 'null' end |
#number? ⇒ Boolean
27 28 29 |
# File 'lib/json/merge/node_wrapper.rb', line 27 def number? @node.type.to_s == 'number' end |
#object? ⇒ Boolean
15 16 17 |
# File 'lib/json/merge/node_wrapper.rb', line 15 def object? @node.type.to_s == 'object' end |
#opening_bracket ⇒ Object
134 135 136 137 138 139 |
# File 'lib/json/merge/node_wrapper.rb', line 134 def opening_bracket return '{' if object? return '[' if array? nil end |
#opening_line ⇒ Object
118 119 120 121 122 123 124 |
# File 'lib/json/merge/node_wrapper.rb', line 118 def opening_line return unless container? && @start_line return opening_bracket if @start_line == @end_line @lines[@start_line - 1] end |
#pair? ⇒ Boolean
39 40 41 |
# File 'lib/json/merge/node_wrapper.rb', line 39 def pair? @node.type.to_s == 'pair' end |
#pairs ⇒ Object
65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/json/merge/node_wrapper.rb', line 65 def pairs return [] unless object? result = [] @node.each do |child| next if child.type.to_s == 'comment' next unless child.type.to_s == 'pair' result << NodeWrapper.new(child, lines: @lines, source: @source, dialect: dialect) end result end |
#root_level_container? ⇒ Boolean
109 110 111 112 113 114 115 116 |
# File 'lib/json/merge/node_wrapper.rb', line 109 def root_level_container? return false unless container? parent_node = @node.parent if @node.respond_to?(:parent) return false unless parent_node parent_node.type.to_s == 'document' end |
#semantic_children ⇒ Object
163 164 165 166 167 168 169 170 171 172 |
# File 'lib/json/merge/node_wrapper.rb', line 163 def semantic_children return [] unless @node.respond_to?(:each) @node.each.filter_map do |child| child_type = child.type.to_s next if %w[comment , : { } [ ]].include?(child_type) child end end |
#string? ⇒ Boolean
23 24 25 |
# File 'lib/json/merge/node_wrapper.rb', line 23 def string? @node.type.to_s == 'string' end |
#value_node ⇒ Object
56 57 58 59 60 61 62 63 |
# File 'lib/json/merge/node_wrapper.rb', line 56 def value_node return unless pair? value = find_child_by_field('value') || semantic_children[1] return unless value NodeWrapper.new(value, lines: @lines, source: @source, dialect: dialect) end |