| using System; |
| using System.Collections; |
| using System.Collections.Generic; |
| |
| namespace Casbin.Model; |
| |
| public record PolicyValues : IPolicyValues |
| { |
| private string _text; |
| |
| public static PolicyValues Empty { get; } = new(); |
| public virtual int Count => 0; |
| public virtual string this[int index] => throw new ArgumentOutOfRangeException(nameof(index)); |
| public virtual IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues>(this); |
| IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); |
| public string ToText() => _text ??= ToText(this); |
| public bool Equals(IPolicyValues other) => Equals(this, other); |
| |
| internal static string ToText<T>(T values) where T : IPolicyValues |
| => string.Join(PermConstants.PolicySeparatorString, values); |
| |
| internal static bool Equals<T>(T values, T other) where T : IPolicyValues |
| => values.Count == other.Count && values.ToText().Equals(other.ToText()); |
| |
| internal static string ToStringValue<T>(T value) => |
| value is not null |
| ? value as string ?? value.ToString() |
| : string.Empty; |
| } |
| |
| public record PolicyValues<T1>(T1 Value1) : PolicyValues |
| { |
| private string _stringValue1; |
| public override int Count => 1; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues<T1>>(this); |
| } |
| |
| public record PolicyValues<T1, T2>(T1 Value1, T2 Value2) : PolicyValues |
| { |
| private string _stringValue1, _stringValue2; |
| public override int Count => 2; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| 1 => _stringValue2 ??= ToStringValue(Value2), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues<T1, T2>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3>(T1 Value1, T2 Value2, T3 Value3) : PolicyValues |
| { |
| private string _stringValue1, _stringValue2, _stringValue3; |
| public override int Count => 3; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| 1 => _stringValue2 ??= ToStringValue(Value2), |
| 2 => _stringValue3 ??= ToStringValue(Value3), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues<T1, T2, T3>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4>(T1 Value1, T2 Value2, T3 Value3, T4 Value4) : PolicyValues |
| { |
| private string _stringValue1, _stringValue2, _stringValue3, _stringValue4; |
| public override int Count => 4; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| 1 => _stringValue2 ??= ToStringValue(Value2), |
| 2 => _stringValue3 ??= ToStringValue(Value3), |
| 3 => _stringValue4 ??= ToStringValue(Value4), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues<T1, T2, T3, T4>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5>(T1 Value1, T2 Value2, T3 Value3, T4 Value4, T5 Value5) : PolicyValues |
| { |
| private string _stringValue1, _stringValue2, _stringValue3, _stringValue4, _stringValue5; |
| public override int Count => 5; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| 1 => _stringValue2 ??= ToStringValue(Value2), |
| 2 => _stringValue3 ??= ToStringValue(Value3), |
| 3 => _stringValue4 ??= ToStringValue(Value4), |
| 4 => _stringValue5 ??= ToStringValue(Value5), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6> |
| (T1 Value1, T2 Value2, T3 Value3, T4 Value4, T5 Value5, T6 Value6) : PolicyValues |
| { |
| private string _stringValue1, _stringValue2, _stringValue3, _stringValue4, _stringValue5, _stringValue6; |
| public override int Count => 6; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| 1 => _stringValue2 ??= ToStringValue(Value2), |
| 2 => _stringValue3 ??= ToStringValue(Value3), |
| 3 => _stringValue4 ??= ToStringValue(Value4), |
| 4 => _stringValue5 ??= ToStringValue(Value5), |
| 5 => _stringValue6 ??= ToStringValue(Value6), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7>(T1 Value1, T2 Value2, T3 Value3, T4 Value4, T5 Value5, T6 Value6, |
| T7 Value7) : PolicyValues |
| { |
| private string _stringValue1, |
| _stringValue2, |
| _stringValue3, |
| _stringValue4, |
| _stringValue5, |
| _stringValue6, |
| _stringValue7; |
| |
| public override int Count => 7; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => _stringValue1 ??= ToStringValue(Value1), |
| 1 => _stringValue2 ??= ToStringValue(Value2), |
| 2 => _stringValue3 ??= ToStringValue(Value3), |
| 3 => _stringValue4 ??= ToStringValue(Value4), |
| 4 => _stringValue5 ??= ToStringValue(Value5), |
| 5 => _stringValue6 ??= ToStringValue(Value6), |
| 6 => _stringValue7 ??= ToStringValue(Value7), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8>(T1 Value1, T2 Value2, T3 Value3, T4 Value4, T5 Value5, |
| T6 Value6, |
| T7 Value7, T8 Value8) : PolicyValues |
| { |
| public override int Count => 8; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 Value1, T2 Value2, T3 Value3, T4 Value4, T5 Value5, |
| T6 Value6, T7 Value7, T8 Value8, T9 Value9) : PolicyValues |
| { |
| public override int Count => 9; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| 8 => ToStringValue(Value9), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(T1 Value1, T2 Value2, T3 Value3, T4 Value4, |
| T5 Value5, |
| T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10) : PolicyValues |
| { |
| public override int Count => 10; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| 8 => ToStringValue(Value9), |
| 9 => ToStringValue(Value10), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(T1 Value1, T2 Value2, T3 Value3, T4 Value4, |
| T5 Value5, T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10, T11 Value11) : PolicyValues |
| { |
| public override int Count => 11; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| 8 => ToStringValue(Value9), |
| 9 => ToStringValue(Value10), |
| 10 => ToStringValue(Value11), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(T1 Value1, T2 Value2, T3 Value3, |
| T4 Value4, |
| T5 Value5, T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10, T11 Value11, T12 Value12) : PolicyValues |
| { |
| public override int Count => 12; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| 8 => ToStringValue(Value9), |
| 9 => ToStringValue(Value10), |
| 10 => ToStringValue(Value11), |
| 11 => ToStringValue(Value12), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(T1 Value1, T2 Value2, T3 Value3, |
| T4 Value4, |
| T5 Value5, T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10, T11 Value11, T12 Value12, T13 Value13) : PolicyValues |
| { |
| public override int Count => 13; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| 8 => ToStringValue(Value9), |
| 9 => ToStringValue(Value10), |
| 10 => ToStringValue(Value11), |
| 11 => ToStringValue(Value12), |
| 12 => ToStringValue(Value13), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>>(this); |
| } |
| |
| public record PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(T1 Value1, T2 Value2, T3 Value3, |
| T4 Value4, |
| T5 Value5, T6 Value6, T7 Value7, T8 Value8, T9 Value9, T10 Value10, T11 Value11, T12 Value12, T13 Value13, T14 Value14) : PolicyValues |
| { |
| public override int Count => 14; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => ToStringValue(Value1), |
| 1 => ToStringValue(Value2), |
| 2 => ToStringValue(Value3), |
| 3 => ToStringValue(Value4), |
| 4 => ToStringValue(Value5), |
| 5 => ToStringValue(Value6), |
| 6 => ToStringValue(Value7), |
| 7 => ToStringValue(Value8), |
| 8 => ToStringValue(Value9), |
| 9 => ToStringValue(Value10), |
| 10 => ToStringValue(Value11), |
| 11 => ToStringValue(Value12), |
| 12 => ToStringValue(Value13), |
| 13 => ToStringValue(Value14), |
| _ => throw new ArgumentOutOfRangeException(nameof(index)) |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<PolicyValues<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>>(this); |
| } |
| |
| internal record DummyPolicyValues(string Value1 = "", string Value2 = "", string Value3 = "", |
| string Value4 = "", string Value5 = "", string Value6 = "", |
| string Value7 = "", string Value8 = "", string Value9 = "", |
| string Value10 = "", string Value11 = "", string Value12 = "", |
| string Value13 = "", string Value14 = "") : PolicyValues |
| { |
| public static new readonly DummyPolicyValues Empty = new(); |
| public override int Count => 14; |
| |
| public override string this[int index] => index switch |
| { |
| 0 => Value1, |
| 1 => Value2, |
| 2 => Value3, |
| 3 => Value4, |
| 4 => Value5, |
| 5 => Value6, |
| 6 => Value7, |
| 7 => Value8, |
| 8 => Value9, |
| 9 => Value10, |
| 10 => Value11, |
| 11 => Value12, |
| 12 => Value13, |
| 13 => Value14, |
| _ => "" |
| }; |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<DummyPolicyValues>(this); |
| } |
| |
| internal record StringListPolicyValues : PolicyValues |
| { |
| private readonly IReadOnlyList<string> _values; |
| |
| public StringListPolicyValues(IReadOnlyList<string> values) |
| { |
| _values = values; |
| Count = values.Count; |
| } |
| |
| public StringListPolicyValues(IReadOnlyList<string> values, int requiredCount) |
| { |
| _values = values; |
| Count = requiredCount; |
| } |
| |
| public override int Count { get; } |
| |
| public override string this[int index] => _values.GetValueOrDefault(index); |
| |
| public override IEnumerator<string> GetEnumerator() => |
| new PolicyEnumerator<StringListPolicyValues>(this); |
| } |
| |
| internal struct PolicyEnumerator<T> : IEnumerator<string> where T : IPolicyValues |
| { |
| public PolicyEnumerator(T value) |
| { |
| _value = value; |
| _index = -1; |
| } |
| |
| private int _index; |
| private readonly T _value; |
| |
| public object Current => _value[_index]; |
| string IEnumerator<string>.Current => _value[_index]; |
| |
| public void Dispose() |
| { |
| } |
| |
| public bool MoveNext() => ++_index < _value.Count; |
| public void Reset() => _index = -1; |
| } |