Class: TreeFilter::Slice

Inherits:
Struct
  • Object
show all
Defined in:
lib/tree_filter.rb

Instance Method Summary collapse

Constructor Details

#initialize(attrs = {}) ⇒ Slice

Returns a new instance of Slice.



93
94
95
96
# File 'lib/tree_filter.rb', line 93

def initialize(attrs = {})
  super
  @attrs = attrs
end

Instance Method Details

#filter(value) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/tree_filter.rb', line 98

def filter(value)
  # With activesupport this will always be evaluated, because `as_json` is
  # monkey-patched on to Object.
  value = value.as_json if value.respond_to?(:as_json)

  case value
  when Hash
    slices = @attrs.dup

    if @attrs.keys.include?('*')
      slices.delete("*")
      extra = value.keys - slices.keys - ['*']
      extra.each do |k|
        slices[k] = nil
      end
    end

    slices.each_with_object({}) do |(attr, slice), ret|
      slice ||= NullSlice.new

      val = value[attr]

      filtered = case val
      when Array
        val.map {|x| slice.filter(x) }
      else
        slice.filter(val)
      end

      ret[attr] = filtered
    end
  when Array
    value.map {|x| filter(x) }
  when Defer
    filter(value.call)
  when Leaf
    filter(value.right)
  else
    value
  end
end

#inspectObject



89
90
91
# File 'lib/tree_filter.rb', line 89

def inspect
  "<Slice #{@attrs.inspect}>"
end