All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.amazon.awssdk.services.neptune.endpoints.internal.FnNode Maven / Gradle / Ivy

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
 * the License. A copy of the License is located at
 * 
 * http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
 * and limitations under the License.
 */

package software.amazon.awssdk.services.neptune.endpoints.internal;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import software.amazon.awssdk.annotations.SdkInternalApi;
import software.amazon.awssdk.protocols.jsoncore.JsonNode;

/**
 * Parsed but not validated function contents containing the `fn` name and `argv`
 */
@SdkInternalApi
public final class FnNode {
    private static final String ARGV = "argv";
    private static final String FN = "fn";

    private final String fn;
    private final List argv;

    private FnNode(Builder builder) {
        this.fn = builder.fn;
        this.argv = builder.argv;
    }

    public static FnNode ofExprs(String fn, Expr... expr) {
        return builder().fn(fn).argv(Arrays.stream(expr).collect(Collectors.toList())).build();
    }

    public Fn validate() {
        switch (fn) {
        case BooleanEqualsFn.ID:
            return new BooleanEqualsFn(this);
        case PartitionFn.ID:
            return new PartitionFn(this);
        case StringEqualsFn.ID:
            return new StringEqualsFn(this);
        case IsSet.ID:
            return new IsSet(this);
        case IsValidHostLabel.ID:
            return new IsValidHostLabel(this);
        case GetAttr.ID:
            return new GetAttr(this);
        case ParseArn.ID:
            return new ParseArn(this);
        case Not.ID:
            return new Not(this);
        case ParseUrl.ID:
            return new ParseUrl(this);
        case Substring.ID:
            return new Substring(this);
        case UriEncodeFn.ID:
            return new UriEncodeFn(this);
        case IsVirtualHostableS3Bucket.ID:
            return new IsVirtualHostableS3Bucket(this);
        default:
            throw RuleError.builder()
                    .cause(SourceException.builder().message(String.format("`%s` is not a valid function", fn)).build()).build();
        }
    }

    public String getId() {
        return fn;
    }

    public List getArgv() {
        return argv;
    }

    public static Builder builder() {
        return new Builder();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        FnNode fnNode = (FnNode) o;

        if (fn != null ? !fn.equals(fnNode.fn) : fnNode.fn != null) {
            return false;
        }
        return argv != null ? argv.equals(fnNode.argv) : fnNode.argv == null;
    }

    @Override
    public int hashCode() {
        int result = fn != null ? fn.hashCode() : 0;
        result = 31 * result + (argv != null ? argv.hashCode() : 0);
        return result;
    }

    public static FnNode fromNode(JsonNode node) {
        Map objNode = node.asObject();

        return builder().fn(objNode.get(FN).asString())
                .argv(objNode.get(ARGV).asArray().stream().map(Expr::fromNode).collect(Collectors.toList())).build();
    }

    public static class Builder {
        private String fn;
        private List argv;

        public Builder() {
        }

        public Builder argv(List argv) {
            this.argv = argv;
            return this;
        }

        public Builder fn(String fn) {
            this.fn = fn;
            return this;
        }

        public FnNode build() {
            return new FnNode(this);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy