Class: Foxtail::Bundle::Resolver
- Inherits:
-
Object
- Object
- Foxtail::Bundle::Resolver
- Defined in:
- lib/foxtail/bundle/resolver.rb
Overview
Pattern resolution engine Corresponds to fluent-bundle/src/resolver.ts
Instance Method Summary collapse
-
#initialize(bundle) ⇒ Resolver
constructor
A new instance of Resolver.
-
#resolve_complex_pattern(elements, scope) ⇒ Object
Resolve a complex pattern (array of elements).
-
#resolve_expression(expr, scope) ⇒ Object
Resolve expressions (variables, terms, messages, functions, etc.).
-
#resolve_pattern(pattern, scope) ⇒ Object
Resolve a pattern with the given scope.
-
#resolve_pattern_element(element, scope, use_isolating: false) ⇒ Object
Resolve individual pattern elements.
Constructor Details
#initialize(bundle) ⇒ Resolver
Returns a new instance of Resolver.
17 |
# File 'lib/foxtail/bundle/resolver.rb', line 17 def initialize(bundle) = @bundle = bundle |
Instance Method Details
#resolve_complex_pattern(elements, scope) ⇒ Object
Resolve a complex pattern (array of elements)
32 33 34 35 36 37 |
# File 'lib/foxtail/bundle/resolver.rb', line 32 def resolve_complex_pattern(elements, scope) # Apply bidi isolation only when use_isolating is true and pattern has multiple elements use_isolating = @bundle.use_isolating? && elements.size > 1 elements.map {|element| resolve_pattern_element(element, scope, use_isolating:) }.join end |
#resolve_expression(expr, scope) ⇒ Object
Resolve expressions (variables, terms, messages, functions, etc.)
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/foxtail/bundle/resolver.rb', line 70 def resolve_expression(expr, scope) case expr when Parser::AST::StringLiteral expr.value.to_s when Parser::AST::NumberLiteral # Return raw numeric value, not formatted string expr.value when Parser::AST::VariableReference resolve_variable_reference(expr, scope) when Parser::AST::TermReference resolve_term_reference(expr, scope) when Parser::AST::MessageReference (expr, scope) when Parser::AST::FunctionReference resolve_function_call(expr, scope) when Parser::AST::SelectExpression resolve_select_expression(expr, scope) else scope.add_error("Unknown expression type: #{expr.class}") "{#{expr.class}}" end end |
#resolve_pattern(pattern, scope) ⇒ Object
Resolve a pattern with the given scope
20 21 22 23 24 25 26 27 28 29 |
# File 'lib/foxtail/bundle/resolver.rb', line 20 def resolve_pattern(pattern, scope) case pattern when String pattern when Array resolve_complex_pattern(pattern, scope) else raise ArgumentError, "Unexpected pattern type: #{pattern.class}" end end |
#resolve_pattern_element(element, scope, use_isolating: false) ⇒ Object
Resolve individual pattern elements
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/foxtail/bundle/resolver.rb', line 40 def resolve_pattern_element(element, scope, use_isolating: false) case element when String # Text elements are not wrapped with isolation marks element when Parser::AST::NumberLiteral result = resolve_expression(element, scope) # For numeric values in patterns, format for display formatted = element.precision > 0 ? format_number(result, element.precision) : result.to_s wrap_with_isolation(formatted, use_isolating) when Parser::AST::VariableReference # Apply implicit NUMBER/DATETIME formatting for variables at display time result = resolve_expression(element, scope) formatted = apply_implicit_function(result) wrap_with_isolation(format_value(formatted), use_isolating) when Parser::AST::FunctionReference # Function results are Function::Value objects that need formatting result = resolve_expression(element, scope) wrap_with_isolation(format_value(result), use_isolating) when Parser::AST::StringLiteral, Parser::AST::TermReference, Parser::AST::MessageReference, Parser::AST::SelectExpression result = resolve_expression(element, scope) wrap_with_isolation(result.to_s, use_isolating) else wrap_with_isolation(element.to_s, use_isolating) end end |