schemaToSource function

String schemaToSource(
  1. SchemaDocument schema
)

Converts a schema AST back into schema.prisma source text.

Implementation

String schemaToSource(SchemaDocument schema) {
  final buffer = StringBuffer();

  void writeSpacerIfNeeded() {
    if (buffer.isNotEmpty) {
      buffer.writeln();
    }
  }

  for (final datasource in schema.datasources) {
    writeSpacerIfNeeded();
    buffer.writeln('datasource ${datasource.name} {');
    for (final entry in datasource.properties.entries) {
      buffer.writeln('  ${entry.key} = ${entry.value}');
    }
    buffer.writeln('}');
  }

  for (final generator in schema.generators) {
    writeSpacerIfNeeded();
    buffer.writeln('generator ${generator.name} {');
    for (final entry in generator.properties.entries) {
      buffer.writeln('  ${entry.key} = ${entry.value}');
    }
    buffer.writeln('}');
  }

  for (final definition in schema.enums) {
    writeSpacerIfNeeded();
    buffer.writeln('enum ${definition.name} {');
    for (final value in definition.values) {
      buffer.writeln('  $value');
    }
    for (final attribute in definition.attributes) {
      buffer.writeln('  ${modelAttributeToSource(attribute)}');
    }
    buffer.writeln('}');
  }

  for (final model in schema.models) {
    writeSpacerIfNeeded();
    buffer.writeln('model ${model.name} {');
    for (final field in model.fields) {
      final rawType = field.isList
          ? '${field.type}[]'
          : field.isNullable
          ? '${field.type}?'
          : field.type;
      final attributes = field.attributes.map(attributeToSource).join(' ');
      if (attributes.isEmpty) {
        buffer.writeln('  ${field.name} $rawType');
      } else {
        buffer.writeln('  ${field.name} $rawType $attributes');
      }
    }

    for (final attribute in model.attributes) {
      buffer.writeln('  ${modelAttributeToSource(attribute)}');
    }

    buffer.writeln('}');
  }

  return buffer.toString();
}