code: func buildAttributeSchema(api *design.APIDefinition, s *JSONSchema, at *design.AttributeDefinition) *JSONSchema {
  	if at.View != "" {
  		inner := NewJSONSchema()
  		inner.Ref = MediaTypeRef(api, at.Type.(*design.MediaTypeDefinition), at.View)
  		s.Merge(inner)
  		return s
  	}
  	s.Merge(TypeSchema(api, at.Type))
  	if s.Ref != "" {
  		// Ref is exclusive with other fields
  		return s
  	}
  	s.DefaultValue = toStringMap(at.DefaultValue)
  	s.Description = at.Description
  	s.Example = at.GenerateExample(api.RandomGenerator(), nil)
  	s.ReadOnly = at.IsReadOnly()
  	val := at.Validation
  	if val == nil {
  		return s
  	}
  	s.Enum = val.Values
  	s.Format = val.Format
  	s.Pattern = val.Pattern
  	if val.Minimum != nil {
  		s.Minimum = val.Minimum
  	}
  	if val.Maximum != nil {
  		s.Maximum = val.Maximum
  	}
  	if val.MinLength != nil {
  		switch {
  		case at.Type.IsArray():
  			s.MinItems = val.MinLength
  		default:
  			s.MinLength = val.MinLength
  		}
  	}
  	if val.MaxLength != nil {
  		switch {
  		case at.Type.IsArray():
  			s.MaxItems = val.MaxLength
  		default:
  			s.MaxLength = val.MaxLength
  		}
  	}
  	s.Required = val.Required
  	return s
  }
docs: // buildAttributeSchema initializes the given JSON schema that corresponds to the given attribute.