Module: Cel::Extensions::String

Defined in:
lib/cel/extensions/string.rb

Class Method Summary collapse

Class Method Details

.__check(funcall, checker:) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/cel/extensions/string.rb', line 8

def __check(funcall, checker:)
  var = funcall.var
  func = funcall.func
  args = funcall.args

  case func
  when :quote
    checker.check_arity(func, args, 1)
    arg = checker.call(args.first)
    return TYPES[:string] if checker.find_match_all_types(i[string], arg)
  when :indexOf, :lastIndexOf
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 2, :>=)
      arg, pos = args
      arg = checker.call(arg)
      if checker.find_match_all_types(i[string], arg)
        return TYPES[:int] if pos.nil?

        pos = checker.call(pos)
        return TYPES[:int] if checker.find_match_all_types(i[int], pos)

      end
    end
  when :split
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 2, :>=)
      arg, pos = args
      arg = checker.call(arg)
      if checker.find_match_all_types(i[string], arg)
        return TYPES[:list, :string] if pos.nil?

        pos = checker.call(pos)
        return TYPES[:list, :string] if checker.find_match_all_types(i[int], pos)

      end
    end
  when :substring
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 2, :>=)
      arg, pos = args
      arg = checker.call(arg)
      if checker.find_match_all_types(i[int], arg)
        return TYPES[:string] if pos.nil?

        pos = checker.call(pos)
        return TYPES[:string] if checker.find_match_all_types(i[int], pos)

      end
    end
  when :trim, :lowerAscii, :upperAscii, :reverse
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 0)
      return TYPES[:string]
    end
  when :format
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 1)
      arg = checker.call(args.first)
      return TYPES[:string] if checker.find_match_all_types(i[list], arg)
    end
  when :charAt
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 1)
      arg = checker.call(args.first)
      return TYPES[:string] if checker.find_match_all_types(i[int], arg)
    end
  when :replace
    if checker.call(var) == TYPES[:string]
      checker.check_arity(func, args, 2..3, :include?)
      p, r, limit = args.map(&checker.method(:call))
      if limit
        return TYPES[:string] if checker.find_match_all_types(i[string], [p, r]) &&
                                 checker.find_match_all_types(i[int], limit)
      elsif checker.find_match_all_types(i[string], [p, r])
        return TYPES[:string]
      end
    end
  when :join
    if checker.call(var) == TYPES[:list, :string] || checker.call(var) == TYPES[:list, :any]
      checker.check_arity(func, args, 1, :>=)
      arg = checker.call(args.first)
      return TYPES[:string] unless arg
      return TYPES[:string] if checker.find_match_all_types(i[string], arg)

    end
  end

  checker.unsupported_operation(funcall)
end

.quote(str, program:) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/cel/extensions/string.rb', line 98

def quote(str, program:)
  value = program.call(str).value

  # this should use String#dump, but this also replaces printable UTF8 characters

  # replace quotes
  value = value.gsub(/[\\'"\t\r\a\b\v\f\n]/) { |m| m.dump[1..-2] }

  # replace invalid utf-8 chars
  value = value.encode(Encoding::UTF_8, invalid: :replace)

  # adding leading quotes if not quoted already
  value = "\"#{value}\"" unless value.start_with?("\"") && value.end_with?("\"")

  Cel::String.new(value)
end