public static EndpointValue fromNode(Node node) {
        Builder builder = new Builder(node);
        ObjectNode objectNode = node.expectObjectNode("endpoints are object nodes");
        objectNode.expectNoAdditionalProperties(NODE_PROPERTIES);

        objectNode.expectStringMember(URL, builder::url);
        objectNode.getObjectMember(PROPERTIES, props -> {
            for (Map.Entry<String, Node> entry : props.getStringMap().entrySet()) {
                builder.putProperty(entry.getKey(), Value.fromNode(entry.getValue()));
            }
        });

        objectNode.getObjectMember(HEADERS, headers -> {
            for (Map.Entry<String, Node> entry : headers.getStringMap().entrySet()) {
                builder.putHeader(entry.getKey(),
                        entry.getValue()
                                .expectArrayNode("Header values must be an array")
                                .getElementsAs(n -> n.expectStringNode().getValue()));
            }
        });
        return builder.build();
    }
Creates an {@link EndpointValue} instance from the given Node information.

@param node the node to deserialize.
@return the created EndpointValue.
smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/evaluation/value/EndpointValue.java