Skip to content

Commit 3a23573

Browse files
Florian KrönertFlorian Krönert
authored andcommitted
Implemented Length function
1 parent 4115531 commit 3a23573

File tree

4 files changed

+51
-1
lines changed

4 files changed

+51
-1
lines changed

build.fsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ let sha = Git.Information.getCurrentHash()
3535
// version info
3636
let major = "3"
3737
let minor = "9"
38-
let patch = "6"
38+
let patch = "7"
3939

4040
// Follow SemVer scheme: http://semver.org/
4141
let asmVersion = major + "." + minor + "." + patch

src/lib/Xrm.Oss.XTL.Interpreter/FunctionHandlers.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,27 @@ private static int Compare(List<ValueExpression> parameters)
427427
return new ValueExpression(string.Join(", ", mappedValues.Select(p => p.Text)), mappedValues);
428428
};
429429

430+
public static FunctionHandler Length = (primary, service, tracing, organizationConfig, parameters) =>
431+
{
432+
if (parameters.Count < 1)
433+
{
434+
throw new InvalidPluginExecutionException("Length function needs at least an array or a string as input");
435+
}
436+
437+
var config = GetConfig(parameters);
438+
439+
var values = parameters[0]?.Value as List<ValueExpression>;
440+
441+
if (values is IEnumerable)
442+
{
443+
return new ValueExpression(values.Count.ToString(), values.Count);
444+
}
445+
446+
var stringValue = CheckedCast<string>(parameters[0]?.Value, "Parameter of length function must be either an array or a string");
447+
448+
return new ValueExpression(stringValue.Length.ToString(), stringValue.Length.ToString());
449+
};
450+
430451
public static FunctionHandler Filter = (primary, service, tracing, organizationConfig, parameters) =>
431452
{
432453
if (parameters.Count < 2)

src/lib/Xrm.Oss.XTL.Interpreter/XTLInterpreter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class XTLInterpreter
4848
{ "IsNull", FunctionHandlers.IsNull },
4949
{ "Join", FunctionHandlers.Join },
5050
{ "Last", FunctionHandlers.Last},
51+
{ "Length", FunctionHandlers.Length },
5152
{ "Map", FunctionHandlers.Map },
5253
{ "NewLine", FunctionHandlers.NewLine },
5354
{ "Not", FunctionHandlers.Not },

src/test/Xrm.Oss.XTL.Interpreter.Tests/XTLInterpreterTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,6 +1055,34 @@ public void It_Should_Parse_Dictionaries()
10551055
Assert.That(result, Is.EqualTo("retrieveLabels: True, returnOptionSetValue: False"));
10561056
}
10571057

1058+
[Test]
1059+
public void It_Should_Count_Length_Of_Arrays()
1060+
{
1061+
var context = new XrmFakedContext();
1062+
var service = context.GetFakedOrganizationService();
1063+
var tracing = context.GetFakeTracingService();
1064+
1065+
var formula = "Length( [ \"A\", \"B\", \"C\" ] )";
1066+
1067+
var result = new XTLInterpreter(formula, null, null, service, tracing).Produce();
1068+
1069+
Assert.That(result, Is.EqualTo("3"));
1070+
}
1071+
1072+
[Test]
1073+
public void It_Should_Count_Length_Of_String()
1074+
{
1075+
var context = new XrmFakedContext();
1076+
var service = context.GetFakedOrganizationService();
1077+
var tracing = context.GetFakeTracingService();
1078+
1079+
var formula = "Length( \"ABC\" )";
1080+
1081+
var result = new XTLInterpreter(formula, null, null, service, tracing).Produce();
1082+
1083+
Assert.That(result, Is.EqualTo("3"));
1084+
}
1085+
10581086
[Test]
10591087
public void It_Should_Not_Fail_On_Complex_Template_Field()
10601088
{

0 commit comments

Comments
 (0)