protected override Task <TProxy> GetRecordValue(IAttributeResolver attributeResolver)
        {
            var result = new TProxy();

            result.SetData(_source);
            return(Task.FromResult(result));
        }
        protected override async Task <RateLimits> GetRecordValue(IAttributeResolver attributeResolver)
        {
            IReadOnlyCollection <string> subscriptionValues = await attributeResolver.Resolve <string>(subscriptionLevel);

            if (subscriptionValues.Count == 0)
            {
                return(new RateLimits());
            }

            IReadOnlyCollection <string> currentRequestValues = await attributeResolver.Resolve <string>(currentRequestsFromQuery);

            long currentRequests = 0;

            if (currentRequestValues.Count > 0)
            {
                if (long.TryParse(currentRequestValues.First(), out long parsedValue))
                {
                    currentRequests = parsedValue;
                }
            }

            long maxRequests = rateLimitMap[subscriptionValues.First()];

            return(new RateLimits
            {
                MaxRequestsPerDay = maxRequests,
                CurrentRequestsPerDay = currentRequests
            });
        }
        protected override async Task <FinanceDepartmentLimits> GetRecordValue(IAttributeResolver attributeResolver)
        {
            // Retrieve the department from the evaluation context
            IReadOnlyCollection <string> departments = await attributeResolver.Resolve <string>(Department);

            double purchaseOrderLimit = 0;

            switch (departments.Single())
            {
            case "engineering": purchaseOrderLimit = 500;
                break;

            case "finance": purchaseOrderLimit = 2000;
                break;
            }

            return(new FinanceDepartmentLimits()
            {
                MaxPurchaseOrder = purchaseOrderLimit
            });
        }
        public void Analyze(StemDefinition destination, Type stemType)
        {
            Type stemBaseType = stemType.GetGenericSubclass(typeof(Stem <>))
                                ?? throw new StemAttributeSetupException("Stem attributes applied to a class that does not derive from Stem<>.");

            Type itemType = stemBaseType.GetGenericArguments()[0];

            foreach (MemberInfo member in stemType.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public))
            {
                foreach (StemAttribute stemAttribute in member.GetCustomAttributes <StemAttribute>())
                {
                    IAttributeResolver resolver = stemAttribute.GetResolver();

                    resolver.Attribute          = stemAttribute;
                    resolver.Definition         = destination;
                    resolver.ItemType           = itemType;
                    resolver.PropertyAutoMapper = _propertyAutoMapper;

                    resolver.IncludeMember(member);
                }
            }
        }
        public async ValueTask <AttributeValueResult <T> > GetValue <T>(PolicyAttribute attribute,
                                                                        IAttributeResolver attributeResolver,
                                                                        IEnforcerLogger evaluationLogger)
        {
            if (attribute == null)
            {
                throw new ArgumentNullException(nameof(attribute));
            }

            if (attribute.RuntimeType != typeof(T))
            {
                evaluationLogger.LogError(
                    $"{GetType().Name}: Requested attribute {attribute} does not match type requested {typeof(T).Name}");
                throw new ArgumentException("Requested attribute does not match type requested", nameof(attribute));
            }

            // Iterate through value providers and aggregate their results
            var sensitivity = PolicyAttributeSensitivity.NonSensitive;
            var values      = Enumerable.Empty <T>();
            var foundValues = false;

            foreach (var provider in _valueProviders)
            {
                var valueResult = await provider.GetValue <T>(attribute, attributeResolver, evaluationLogger);

                sensitivity = MostSensitive(sensitivity, valueResult.Sensitivity);
                if (valueResult.HasValues)
                {
                    values      = values.Concat(valueResult.Values);
                    foundValues = true;
                }
            }

            return(foundValues
                ? new AttributeValueResult <T>(values.ToArray(), sensitivity)
                : AttributeValueResult <T> .CacheableEmpty);
        }
 public string Calculate(IAttributeResolver person)
 {
     return($"{person.GetAttributeValue<string>("firstname")} {person.GetAttributeValue<string>("lastname")}");
 }
 protected override Task <ActionAttributeValueProvider> GetRecordValue(IAttributeResolver attributeResolver)
 {
     return(Task.FromResult(this));
 }