// Path: src/main/java/com/at/avro/AvroSchema.java
// public class AvroSchema {
//     private final String name;
//     private final String namespace;
//     private final String doc;
// 
//     private List<AvroField> fields;
// 
//     private Map<String, String> customProperties = new LinkedHashMap<>();
// 
//     public AvroSchema(Table table, AvroConfig avroConfig) {
//         this.name = avroConfig.getSchemaNameMapper().apply(table.getName());
//         this.namespace = avroConfig.getNamespace();
//         this.doc = avroConfig.isUseSqlCommentsAsDoc() ? table.getRemarks() : null;
//         this.fields = new ArrayList<>(table.getColumns().size());
// 
//         for (Column column : table.getColumns()) {
//             this.fields.add(new AvroField(column, avroConfig));
//         }
// 
//         avroConfig.getAvroSchemaPostProcessor().accept(this, table);
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getNamespace() {
//         return namespace;
//     }
//     
//     public String getDoc() {
//         return doc;
//     }
//     
//     public boolean isDocSet() {
//         return StringUtils.isNotBlank(doc);
//     }
// 
//     public List<AvroField> getFields() {
//         return fields;
//     }
// 
//     public void addCustomProperty(String name, String value) {
//         customProperties.put(name, value);
//     }
// 
//     public Map<String, String> getCustomProperties() {
//         return customProperties;
//     }
// 
//     @Override
//     public String toString() {
//         StringJoiner joiner = new StringJoiner(", ", AvroSchema.class.getSimpleName() + "[", "]")
//             .add("name='" + name + "'")
//             .add("namespace='" + namespace + "'");
//         
//         if (isDocSet()) {
//             joiner.add("doc='" + doc + "'");
//         }
//         joiner
//             .add("fields=" + fields)
//             .add("customProperties=" + customProperties);
//         
//         return joiner.toString();
//     }
// }


import java.math.BigDecimal;
import java.util.Date;
import java.util.function.BiConsumer;
import java.util.function.Function;
import com.at.avro.AvroSchema;
import schemacrawler.schema.Table;
package com.at.avro.config;




/**
 * Configuration that allows avro model tweaking. Model is then used to generate schemas.
 *
 * @author artur@callfire.com
 */
public class AvroConfig {

    private boolean representEnumsAsStrings = false;
    private boolean nullableTrueByDefault = false;
    private boolean allFieldsDefaultNull = false;
    private boolean useSqlCommentsAsDoc = false;

    private Class<?> decimalTypeClass = BigDecimal.class;
    private Class<?> dateTypeClass = Date.class;

    private final String namespace;

    private Function<String, String> schemaNameMapper = tableName -> tableName;
    private Function<String, String> fieldNameMapper = columnName -> columnName;
    private Function<String, String> unknownTypeResolver = dbType -> { throw new IllegalArgumentException("unknown data type: " + dbType); };
// Path: src/main/java/com/at/avro/AvroSchema.java
// public class AvroSchema {
//     private final String name;
//     private final String namespace;
//     private final String doc;
// 
//     private List<AvroField> fields;
// 
//     private Map<String, String> customProperties = new LinkedHashMap<>();
// 
//     public AvroSchema(Table table, AvroConfig avroConfig) {
//         this.name = avroConfig.getSchemaNameMapper().apply(table.getName());
//         this.namespace = avroConfig.getNamespace();
//         this.doc = avroConfig.isUseSqlCommentsAsDoc() ? table.getRemarks() : null;
//         this.fields = new ArrayList<>(table.getColumns().size());
// 
//         for (Column column : table.getColumns()) {
//             this.fields.add(new AvroField(column, avroConfig));
//         }
// 
//         avroConfig.getAvroSchemaPostProcessor().accept(this, table);
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getNamespace() {
//         return namespace;
//     }
//     
//     public String getDoc() {
//         return doc;
//     }
//     
//     public boolean isDocSet() {
//         return StringUtils.isNotBlank(doc);
//     }
// 
//     public List<AvroField> getFields() {
//         return fields;
//     }
// 
//     public void addCustomProperty(String name, String value) {
//         customProperties.put(name, value);
//     }
// 
//     public Map<String, String> getCustomProperties() {
//         return customProperties;
//     }
// 
//     @Override
//     public String toString() {
//         StringJoiner joiner = new StringJoiner(", ", AvroSchema.class.getSimpleName() + "[", "]")
//             .add("name='" + name + "'")
//             .add("namespace='" + namespace + "'");
//         
//         if (isDocSet()) {
//             joiner.add("doc='" + doc + "'");
//         }
//         joiner
//             .add("fields=" + fields)
//             .add("customProperties=" + customProperties);
//         
//         return joiner.toString();
//     }
// }


// Path: src/main/java/com/at/avro/config/AvroConfig.java
import java.math.BigDecimal;
import java.util.Date;
import java.util.function.BiConsumer;
import java.util.function.Function;
import com.at.avro.AvroSchema;
import schemacrawler.schema.Table;

package com.at.avro.config;




/**
 * Configuration that allows avro model tweaking. Model is then used to generate schemas.
 *
 * @author artur@callfire.com
 */
public class AvroConfig {

    private boolean representEnumsAsStrings = false;
    private boolean nullableTrueByDefault = false;
    private boolean allFieldsDefaultNull = false;
    private boolean useSqlCommentsAsDoc = false;

    private Class<?> decimalTypeClass = BigDecimal.class;
    private Class<?> dateTypeClass = Date.class;

    private final String namespace;

    private Function<String, String> schemaNameMapper = tableName -> tableName;
    private Function<String, String> fieldNameMapper = columnName -> columnName;
    private Function<String, String> unknownTypeResolver = dbType -> { throw new IllegalArgumentException("unknown data type: " + dbType); };
    private BiConsumer<AvroSchema, Table> avroSchemaPostProcessor = (schema, table) -> {};