/// <summary>
        /// Transform specified JSON-object with specified transformation.
        /// </summary>
        /// <param name="sourceObject">Source JSON-object.</param>
        /// <param name="transformationObject">Transformation meta object.</param>
        /// <param name="transformContext">Transformation context.</param>
        /// <param name="errorHandler">Error handler.</param>
        /// <returns>Transformation result object.</returns>
        internal static JObject Transform(
            JObject sourceObject,
            JObject transformationObject,
            ITransformationInvokeContext transformContext,
            EventHandler <TransformErrorEventArgs> errorHandler)
        {
            var resultObject    = (JObject)sourceObject.DeepClone();
            var transformations = new Stack <ITransformation>();

            transformContext = transformContext ?? new TransformationInvokeContext
            {
                Source = sourceObject,
            };

            Walk(transformationObject, transformations);

            resultObject.Merge(transformationObject, MergeSettings);

            while (transformations.Count > 0)
            {
                var transformation = transformations.Pop();
                transformation.OnError += errorHandler;
                transformation.ApplyTo(resultObject, transformContext);
            }

            return(resultObject);
        }
        /// <inheritdoc />
        public override void ApplyTo(JObject target, ITransformationInvokeContext context)
        {
            var token = target.SelectToken(Context.TargetPath);

            switch (token)
            {
            case JArray array:
                array.Merge(_argument, MergeSettings);
                break;

            default:
                OnErrorInternal($"\"Add\" transformation for type {token.Type} is not implemented yet.");
                break;
            }
        }
        /// <inheritdoc />
        public override void ApplyTo(JObject target, ITransformationInvokeContext context)
        {
            var token = target.SelectToken(Context.TargetPath);

            if (token == null)
            {
                return;
            }

            try
            {
                token.Parent.Remove();
            }
            catch (Exception e)
            {
                OnErrorInternal($"Error while removing. {e.Message}");
            }
        }
        /// <inheritdoc />
        public override void ApplyTo(JObject target, ITransformationInvokeContext context)
        {
            var copyingToken = context.Source.SelectToken(_sourcePath ?? string.Empty);
            var targetToken  = target.SelectToken(Context.TargetPath);

            if (copyingToken == null)
            {
                OnErrorInternal($"Unable to find node \"{_sourcePath}\" to copy from it.");

                return;
            }

            if (targetToken == null)
            {
                OnErrorInternal($"Unable to find node \"{Context.TargetPath}\" to copy there.");

                return;
            }

            targetToken.Replace(copyingToken);
        }
        /// <inheritdoc />
        public override void ApplyTo(JObject target, ITransformationInvokeContext context)
        {
            if (_transformationObject == null)
            {
                OnErrorInternal("Unable to read foreach transformation.");

                return;
            }

            var token = target.SelectToken(Context.TargetPath);

            if (token is JArray targetArray)
            {
                for (var i = 0; i < targetArray.Count; i++)
                {
                    if (targetArray[i] is JObject targetObject)
                    {
                        // TODO: Analyze errors.
                        var transformedItem = JsonTransformer.Transform(
                            targetObject,
                            (JObject)_transformationObject.DeepClone(),
                            context,
                            (sender, args) => OnItemTransformError(i, args));

                        targetObject.Replace(transformedItem);
                    }
                    else
                    {
                        OnErrorInternal($"Can not apply ForEach transformation to {Context.TargetPath}. Target item must be a JObject");
                    }
                }
            }
            else
            {
                OnErrorInternal($"Can not apply ForEach transformation to {Context.TargetPath}. Target must be a JObject, but type is {token.Type}");
            }
        }
Beispiel #6
0
        public override void ApplyTo(JObject target, ITransformationInvokeContext context)
        {
            var targetToken = (JValue)target.SelectToken(Context.TargetPath);

            targetToken.Value = Expected;
        }
Beispiel #7
0
 /// <inheritdoc />
 public abstract void ApplyTo(JObject target, ITransformationInvokeContext context);