Class: Json::Merge::NodeWrapper

Inherits:
Ast::Merge::NodeWrapperBase
  • Object
show all
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

Instance Method Summary collapse

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, **options)
  @dialect = dialect.to_sym
  super(node, lines: lines, source: source, **options)
end

Instance Attribute Details

#dialectObject (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

Returns:

  • (Boolean)


19
20
21
# File 'lib/json/merge/node_wrapper.rb', line 19

def array?
  @node.type.to_s == 'array'
end

#boolean?Boolean

Returns:

  • (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_bracketObject



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_lineObject



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

Returns:

  • (Boolean)


43
44
45
# File 'lib/json/merge/node_wrapper.rb', line 43

def comment?
  @node.type.to_s == 'comment'
end

#container?Boolean

Returns:

  • (Boolean)


105
106
107
# File 'lib/json/merge/node_wrapper.rb', line 105

def container?
  object? || array?
end

#elementsObject



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_nameObject



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_childrenObject



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

Returns:

  • (Boolean)


35
36
37
# File 'lib/json/merge/node_wrapper.rb', line 35

def null?
  @node.type.to_s == 'null'
end

#number?Boolean

Returns:

  • (Boolean)


27
28
29
# File 'lib/json/merge/node_wrapper.rb', line 27

def number?
  @node.type.to_s == 'number'
end

#object?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/json/merge/node_wrapper.rb', line 15

def object?
  @node.type.to_s == 'object'
end

#opening_bracketObject



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_lineObject



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

Returns:

  • (Boolean)


39
40
41
# File 'lib/json/merge/node_wrapper.rb', line 39

def pair?
  @node.type.to_s == 'pair'
end

#pairsObject



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

Returns:

  • (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_childrenObject



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

Returns:

  • (Boolean)


23
24
25
# File 'lib/json/merge/node_wrapper.rb', line 23

def string?
  @node.type.to_s == 'string'
end

#value_nodeObject



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