code: func UnmarshalWithSchema(schemaDefinition string, object interface{}, data []byte) error {
  	schema, err := jsonschema.New([]byte(schemaDefinition))
  	if err != nil {
  		return trace.Wrap(err)
  	}
  	jsonData, err := ToJSON(data)
  	if err != nil {
  		return trace.Wrap(err)
  	}
  
  	raw := map[string]interface{}{}
  	if err := json.Unmarshal(jsonData, &raw); err != nil {
  		return trace.Wrap(err)
  	}
  	// schema will check format and set defaults
  	processed, err := schema.ProcessObject(raw)
  	if err != nil {
  		return trace.Wrap(err)
  	}
  	// since ProcessObject works with unstructured data, the
  	// data needs to be re-interpreted in structured form
  	bytes, err := json.Marshal(processed)
  	if err != nil {
  		return trace.Wrap(err)
  	}
  	if err := json.Unmarshal(bytes, object); err != nil {
  		return trace.Wrap(err)
  	}
  	return nil
  }
docs: // UnmarshalWithSchema processes YAML or JSON encoded object with JSON schema, sets defaults
  // and unmarshals resulting object into given struct