From 5b618cd70cad3dbfd798fb47946f259e53e18339 Mon Sep 17 00:00:00 2001 From: Anh Tuan Date: Tue, 10 Jan 2023 14:48:05 +0900 Subject: [PATCH] support string concatenation with + --- README.md | 2 +- lib/src/common/types/string.dart | 8 +++++++- test/cel_test.dart | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90d83fc..00f1434 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ From . | _+_ | (int, int) -> int | arithmetic | ✅ | | | (uint, uint) -> uint | arithmetic | ✅ | | | (double, double) -> double | arithmetic | | -| | (string, string) -> string | String concatenation. | | +| | (string, string) -> string | String concatenation. | ✅ | | | (bytes, bytes) -> bytes | bytes concatenation | | | | (list(A), list(A)) -> list(A) | List concatenation. | | | | (google.protobuf.Timestamp, google.protobuf.Duration) -> google.protobuf.Timestamp | arithmetic | ❌ | diff --git a/lib/src/common/types/string.dart b/lib/src/common/types/string.dart index 4a64675..67b08f9 100644 --- a/lib/src/common/types/string.dart +++ b/lib/src/common/types/string.dart @@ -1,5 +1,6 @@ import 'package:cel/src/common/types/bool.dart'; import 'package:cel/src/common/types/traits/matcher.dart'; +import 'package:cel/src/common/types/traits/math.dart'; import 'package:cel/src/common/types/traits/traits.dart'; import '../overloads/overloads.dart'; @@ -16,7 +17,7 @@ final stringType = Type_('string', { Traits.SizerType }); -class StringValue extends Value implements Receiver, Matcher { +class StringValue extends Value implements Receiver, Matcher, Adder { StringValue(this.value); @override @@ -34,6 +35,11 @@ class StringValue extends Value implements Receiver, Matcher { BooleanValue match(Value pattern) { return BooleanValue(RegExp(pattern.value).hasMatch(value)); } + + @override + add(Value other) { + return StringValue(value + other.value); + } } // class String_ extends String implements Receiver { diff --git a/test/cel_test.dart b/test/cel_test.dart index faa0db3..a8366d5 100644 --- a/test/cel_test.dart +++ b/test/cel_test.dart @@ -219,6 +219,12 @@ void main() { final p = environment.makeProgram(ast); expect(p.evaluate({}), 2.6); }); + test('string', () { + final environment = Environment.standard(); + final ast = environment.compile('"ab" + "cd"'); + final p = environment.makeProgram(ast); + expect(p.evaluate({}), 'abcd'); + }); }); test('-', () { final environment = Environment.standard();