Module: Jade::Codegen::Boundary::Specialized::List
Overview
List(t) where t is itself specializable. Two shapes:
List(scalar)— emits a singleArray#all?C-loop check viaBoundary.list_of, then passes the array through.List(specializable)— validates Array shape withBoundary.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
- #map_expr(elem, value_expr) ⇒ 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 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 21 def encode(type, value_expr, registry) inner_of(type) &.then { Specialized.encode_expr(it, '_1', registry) } &.then { map_expr(it, value_expr) } end |
#identity_encoder?(type) ⇒ Boolean
34 35 36 37 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 34 def identity_encoder?(type) inner = inner_of(type) or return false Specialized.identity_encoder?(inner) end |
#inner_of(type) ⇒ Object
44 45 46 47 48 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 44 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 |
#map_expr(elem, value_expr) ⇒ Object
27 28 29 30 31 32 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 27 def map_expr(elem, value_expr) case elem in ::String then "#{value_expr}.map { #{elem} }" in :identity then nil end end |
#specializable?(type, registry, seen) ⇒ Boolean
39 40 41 42 |
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 39 def specializable?(type, registry, seen) inner = inner_of(type) or return false Specialized.specializable_field?(inner, registry, seen) end |