export function adaptModelField()

in packages/autorest.go/src/m4togocodemodel/types.ts [174:229]


export function adaptModelField(prop: m4.Property, obj: m4.ObjectSchema): go.ModelField {
  const fieldType = adaptPossibleType(prop.schema);
  let required = prop.required === true;
  if (go.isLiteralValue(fieldType)) {
    // for OpenAPI, literal values are always considered required
    required = true;
  }
  const annotations = new go.ModelFieldAnnotations(required, prop.readOnly === true, prop.language.go!.isAdditionalProperties === true, prop.isDiscriminator === true);
  const field = new go.ModelField(prop.language.go!.name, fieldType, prop.language.go!.byValue === true, prop.serializedName, annotations);
  if (hasDescription(prop.language.go!)) {
    field.docs.description = prop.language.go!.description;
  }
  if (prop.isDiscriminator && obj.discriminatorValue) {
    field.defaultValue = getDiscriminatorLiteral(obj.discriminatorValue);
  } else if (prop.clientDefaultValue) {
    if (!go.isLiteralValueType(field.type)) {
      throw new Error(`unsupported default value type ${go.getTypeDeclaration(field.type)} for field ${field.name}`);
    }
    if (go.isConstantType(field.type)) {
      // find the corresponding ConstantValue
      const constType = types.get(field.type.name);
      if (!constType) {
        throw new Error(`didn't find ConstantType for ${field.type.name}`);
      }
      let found = false;
      for (const val of values((<go.ConstantType>constType).values)) {
        if (val.value === prop.clientDefaultValue) {
          const keyName = `literal-${val.name}`;
          let literalValue = types.get(keyName);
          if (!literalValue) {
            literalValue = new go.LiteralValue(field.type, val);
            types.set(keyName, literalValue);
          }
          field.defaultValue = <go.LiteralValue>literalValue;
          found = true;
          break;
        }
      }
      if (!found) {
        throw new Error(`didn't find ConstantValue for ${prop.clientDefaultValue}`);
      }
    } else {
      const keyName = `literal-${go.getTypeDeclaration(field.type)}-${prop.clientDefaultValue}`;
      let literalValue = types.get(keyName);
      if (!literalValue) {
        literalValue = new go.LiteralValue(field.type, prop.clientDefaultValue);
        types.set(keyName, literalValue);
      }
      field.defaultValue = <go.LiteralValue>literalValue;
    }
  }

  field.xml = adaptXMLInfo(prop.schema);

  return field;
}