-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #29 from thygesteffensen/issue/3/collections
Issue/3/collections
- Loading branch information
Showing
11 changed files
with
489 additions
and
31 deletions.
There are no files selected for viewing
50 changes: 50 additions & 0 deletions
50
...MockUp/ExpressionParser/Functions/Implementations/CollectionFunctions/ContainsFunction.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using Parser.ExpressionParser.Functions.Base; | ||
|
||
namespace Parser.ExpressionParser.Functions.Implementations.CollectionFunctions | ||
{ | ||
public class ContainsFunction : Function | ||
{ | ||
public ContainsFunction() : base("contains") | ||
{ | ||
} | ||
|
||
public override ValueContainer ExecuteFunction(params ValueContainer[] parameters) | ||
{ | ||
var collection = parameters[0]; | ||
var value = parameters[1]; | ||
|
||
switch (collection.Type()) | ||
{ | ||
case ValueContainer.ValueType.Array: | ||
var array = collection.GetValue<IEnumerable<ValueContainer>>(); | ||
|
||
switch (value.Type()) | ||
{ | ||
case ValueContainer.ValueType.Integer: | ||
case ValueContainer.ValueType.Float: | ||
case ValueContainer.ValueType.String: | ||
case ValueContainer.ValueType.Boolean: | ||
case ValueContainer.ValueType.Null: | ||
return new ValueContainer(array.Contains(value)); | ||
case ValueContainer.ValueType.Array: | ||
case ValueContainer.ValueType.Object: | ||
return new ValueContainer(false); | ||
default: | ||
throw new ArgumentOutOfRangeException(); | ||
} | ||
case ValueContainer.ValueType.Object: | ||
var key = value.GetValue<string>(); | ||
return new ValueContainer(collection.AsDict().ContainsKey(key)); | ||
case ValueContainer.ValueType.String: | ||
var text = collection.GetValue<string>(); | ||
var substring = value.GetValue<string>(); | ||
return new ValueContainer(text.Contains(substring)); | ||
default: | ||
throw new PowerAutomateMockUpException($"Cannot perform contains on {collection.Type()}."); | ||
} | ||
} | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...ateMockUp/ExpressionParser/Functions/Implementations/CollectionFunctions/EmptyFunction.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using Parser.ExpressionParser.Functions.Base; | ||
|
||
namespace Parser.ExpressionParser.Functions.Implementations.CollectionFunctions | ||
{ | ||
public class EmptyFunction : Function | ||
{ | ||
public EmptyFunction() : base("empty") | ||
{ | ||
} | ||
|
||
public override ValueContainer ExecuteFunction(params ValueContainer[] parameters) | ||
{ | ||
var value = parameters[0]; | ||
|
||
return value.Type() switch | ||
{ | ||
ValueContainer.ValueType.String => new ValueContainer(string.IsNullOrEmpty(value.GetValue<string>())), | ||
ValueContainer.ValueType.Array => new ValueContainer( | ||
!value.GetValue<IEnumerable<ValueContainer>>().Any()), | ||
ValueContainer.ValueType.Object => new ValueContainer( | ||
value.GetValue<Dictionary<string, ValueContainer>>().Count == 0), | ||
ValueContainer.ValueType.Null => new ValueContainer(true), | ||
_ => throw new PowerAutomateMockUpException( | ||
$"Empty expression can only operate on String, Array or Object types, not {value.Type()}.") | ||
}; | ||
} | ||
} | ||
} |
28 changes: 28 additions & 0 deletions
28
...ateMockUp/ExpressionParser/Functions/Implementations/CollectionFunctions/FirstFunction.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using Parser.ExpressionParser.Functions.Base; | ||
|
||
namespace Parser.ExpressionParser.Functions.Implementations.CollectionFunctions | ||
{ | ||
public class FirstFunction : Function | ||
{ | ||
public FirstFunction() : base("first") | ||
{ | ||
} | ||
|
||
public override ValueContainer ExecuteFunction(params ValueContainer[] parameters) | ||
{ | ||
var value = parameters[0]; | ||
|
||
return value.Type() switch | ||
{ | ||
ValueContainer.ValueType.String => new ValueContainer( | ||
value.GetValue<string>().Substring(0, 1)), | ||
ValueContainer.ValueType.Array => new ValueContainer( | ||
value.GetValue<IEnumerable<ValueContainer>>().First()), | ||
_ => throw new PowerAutomateMockUpException( | ||
$"Empty expression can only operate on String or Array types, not {value.Type()}.") | ||
}; | ||
} | ||
} | ||
} |
65 changes: 65 additions & 0 deletions
65
...Up/ExpressionParser/Functions/Implementations/CollectionFunctions/IntersectionFunction.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using Parser.ExpressionParser.Functions.Base; | ||
|
||
namespace Parser.ExpressionParser.Functions.Implementations.CollectionFunctions | ||
{ | ||
public class InterSectionFunction : Function | ||
{ | ||
public InterSectionFunction() : base("intersection") | ||
{ | ||
} | ||
|
||
public override ValueContainer ExecuteFunction(params ValueContainer[] parameters) | ||
{ | ||
return parameters[0].Type() switch | ||
{ | ||
ValueContainer.ValueType.Array => IntersectList(parameters), | ||
ValueContainer.ValueType.Object => IntersectDict(parameters), | ||
_ => throw new PowerAutomateMockUpException( | ||
$"Can only intersect Array and Object, not {parameters[0].Type()}.") | ||
}; | ||
} | ||
|
||
private ValueContainer IntersectDict(IReadOnlyList<ValueContainer> parameters) | ||
{ | ||
var first = parameters[0].GetValue<Dictionary<string, ValueContainer>>(); | ||
|
||
var intersect = | ||
ToDictionary(first, parameters[1]); | ||
|
||
if (parameters.Count > 2) | ||
{ | ||
intersect = parameters.Skip(2).Aggregate(intersect, ToDictionary); | ||
} | ||
|
||
return new ValueContainer(intersect); | ||
} | ||
|
||
private Dictionary<string, ValueContainer> ToDictionary(Dictionary<string, ValueContainer> first, | ||
ValueContainer valueContainer) | ||
{ | ||
var second = valueContainer.GetValue<Dictionary<string, ValueContainer>>(); | ||
|
||
return first.Where(x => second.ContainsKey(x.Key)) | ||
.ToDictionary(x => x.Key, x => second[x.Key]); | ||
} | ||
|
||
private ValueContainer IntersectList(IReadOnlyList<ValueContainer> parameters) | ||
{ | ||
var first = parameters[0].GetValue<IEnumerable<ValueContainer>>(); | ||
var second = parameters[1].GetValue<IEnumerable<ValueContainer>>(); | ||
|
||
var intersection = first.Intersect(second, new ValueContainerComparer()); | ||
|
||
if (parameters.Count > 2) | ||
{ | ||
intersection = parameters.Skip(2) | ||
.Select(valueContainer => valueContainer.GetValue<IEnumerable<ValueContainer>>()) | ||
.Aggregate(intersection, (current, collection) => current.Intersect(collection)); | ||
} | ||
|
||
return new ValueContainer(intersection); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.