CsvRecordHandler.java

package de.siegmar.fastcsv.reader;

import java.util.Objects;
import java.util.function.Consumer;

/// A [CsvCallbackHandler] implementation that returns a [CsvRecord] for each record.
///
/// Example:
/// ```
/// CsvRecordHandler handler = CsvRecordHandler.builder()
///     .fieldModifier(FieldModifiers.TRIM)
///     .build();
/// ```
///
/// This implementation is stateful and must not be reused.
public final class CsvRecordHandler extends AbstractInternalCsvCallbackHandler<CsvRecord> {

    private CsvRecordHandler(final int maxFields, final int maxFieldSize, final int maxRecordSize,
                             final FieldModifier fieldModifier) {
        super(maxFields, maxFieldSize, maxRecordSize, fieldModifier);
    }

    /// Constructs a new builder instance for this class.
    ///
    /// @return the builder
    /// @see #of(Consumer)
    public static CsvRecordHandlerBuilder builder() {
        return new CsvRecordHandlerBuilder();
    }

    /// Constructs a new instance of this class with default settings.
    ///
    /// @return the new instance
    /// @see CsvRecordHandlerBuilder#build()
    public static CsvRecordHandler of() {
        return builder().build();
    }

    /// Constructs a new instance of this class with the given configuration.
    ///
    /// This is an alternative to the builder pattern for convenience.
    ///
    /// @param configurer the configuration, must not be `null`
    /// @return the new instance
    /// @throws NullPointerException if `null` is passed
    /// @throws IllegalArgumentException if argument constraints are violated
    /// @see #builder()
    public static CsvRecordHandler of(final Consumer<CsvRecordHandlerBuilder> configurer) {
        Objects.requireNonNull(configurer, "configurer must not be null");
        final CsvRecordHandlerBuilder builder = builder();
        configurer.accept(builder);
        return builder.build();
    }

    @Override
    protected CsvRecord buildRecord() {
        return new CsvRecord(startingLineNumber, compactFields(), recordType == RecordType.COMMENT);
    }

    /// A builder for [CsvRecordHandler].
    public static final class CsvRecordHandlerBuilder
        extends AbstractInternalCsvCallbackHandlerBuilder<CsvRecordHandlerBuilder> {

        private CsvRecordHandlerBuilder() {
        }

        @Override
        protected CsvRecordHandlerBuilder self() {
            return this;
        }

        /// Builds the [CsvRecordHandler] instance.
        ///
        /// @return the new instance
        /// @throws IllegalArgumentException if argument constraints are violated
        ///     (see [AbstractInternalCsvCallbackHandler])
        public CsvRecordHandler build() {
            return new CsvRecordHandler(maxFields, maxFieldSize, maxRecordSize, fieldModifier);
        }

    }

}