Module: Jade::Codegen::Boundary::Specialized::List
Overview
‘List(t)` where `t` is itself specializable. Two shapes:
-
‘List(scalar)` — emits a single `Array#all?` C-loop check via `Boundary.list_of`, then passes the array through.
-
‘List(specializable)` — validates Array shape with `Boundary.array`, then maps the inner decoder over each element.
Instance Method Summary collapse
- #decode(type, input, registry) ⇒ Object
- #encode(type, value_expr, registry) ⇒ Object
- #identity_encoder?(type) ⇒ Boolean
- #inner_of(type) ⇒ Object
- #specializable?(type, registry, seen) ⇒ Boolean
Instance Method Details
#decode(type, input, registry) ⇒ Object
14 15 16 17 18 19 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 14 def decode(type, input, registry) inner = inner_of(type) or return nil scalar_optimized(inner, input) || generic_decode(type, inner, input, registry) end |
#encode(type, value_expr, registry) ⇒ Object
21 22 23 24 25 26 27 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 21 def encode(type, value_expr, registry) inner = inner_of(type) or return nil return nil if Specialized.identity_encoder?(inner) elem = Specialized.encode_expr(inner, '_1', registry) or return nil "#{value_expr}.map { #{elem} }" end |
#identity_encoder?(type) ⇒ Boolean
29 30 31 32 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 29 def identity_encoder?(type) inner = inner_of(type) or return false Specialized.identity_encoder?(inner) end |
#inner_of(type) ⇒ Object
39 40 41 42 43 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 39 def inner_of(type) return nil unless Specialized.qname_of(type) == 'List.List' args = Specialized.args_of(type) args&.size == 1 ? args[0] : nil end |
#specializable?(type, registry, seen) ⇒ Boolean
34 35 36 37 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 34 def specializable?(type, registry, seen) inner = inner_of(type) or return false Specialized.specializable_field?(inner, registry, seen) end |