@Nullable
public TNodeTemplate buildNodeTemplate(Object object, Parameter<TNodeTemplate> parameter) {
if (Objects.isNull(object)) return new TNodeTemplate();
if (!validate(TNodeTemplate.class, object, parameter)) return null;
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) object;
return new TNodeTemplate.Builder(buildQName(stringValue(map.get("type"))))
.setDescription(buildDescription(map.get("description")))
.setMetadata(buildMetadata(map.get("metadata")))
.setDirectives(buildListString(map.get("directives"),
new Parameter<List<String>>(parameter.getContext()).addContext("directives")
))
.setProperties(buildMap(map, "properties", this::buildPropertyAssignment, parameter))
.setAttributes(buildMap(map, "attributes", this::buildAttributeAssignment, parameter))
.setRequirements(buildList(map, "requirements", this::buildMapRequirementAssignment, parameter))
.setCapabilities(buildMap(map, "capabilities", this::buildCapabilityAssignment, parameter))
.setInterfaces(buildMap(map.get("interfaces"),
new Parameter<TInterfaceDefinition>(parameter.getContext()).addContext("interfaces")
.setValue("TNodeTemplate")
.setBuilderOO(this::buildInterfaceDefinition)
))
.setArtifacts(buildMap(map, "artifacts", this::buildArtifactDefinition, parameter))
.setNodeFilter(buildNodeFilterDefinition(map.get("node_filter"),
new Parameter<TNodeFilterDefinition>(parameter.getContext()).addContext("node_filter")
))
.setCopy(buildQName(stringValue(map.get("copy"))))
.build();
}