Source: columns/PositiveIntegerColumn.js

import { AbstractColumn } from './AbstractColumn.js';

/**
 * Positive integer column formatted with leading zeros.
 * Parses strings of digits into integer numbers, and serializes positive integers padded with leading zeros.
 *
 * @extends AbstractColumn
 * @example
 * const col = new PositiveIntegerColumn('age', 3, 'Age in years');
 * col.toValue('045'); // 45
 * col.toStr(45); // '045'
 */
export class PositiveIntegerColumn extends AbstractColumn {
  /**
   * Converts raw string slice from file into a positive integer.
   *
   * @param {string} slice - Raw fixed-width slice consisting of digits.
   * @returns {number} Parsed integer value.
   * @throws {Error} If slice contains non-digit characters or parses to negative integer.
   */
  toValue(slice) {
    super.toValue(slice);
    const trimmed = slice.trim();
    if (!/^\d+$/.test(trimmed)) {
      throw new Error(`Informe uma string para converter corretamente, '${slice}' não é um 'positive int'`);
    }
    const val = parseInt(trimmed, 10);
    if (val < 0) {
      throw new Error(`Informe uma string para converter corretamente, '${slice}' não é um 'positive int'`);
    }
    return val;
  }

  /**
   * Serializes a non-negative integer into a zero-padded fixed-width string.
   *
   * @param {number|null} value - Positive integer value to serialize. Null/undefined serializes to zeros.
   * @returns {string} Zero-padded fixed-width string.
   * @throws {Error} If value is not a non-negative integer or exceeds size formatted length.
   */
  toStr(value) {
    if (value === null || value === undefined) {
      return '0'.repeat(this.size);
    }
    if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
      throw new Error(`O campo '${this.name}' só aceita 'positive int' ou 'None'`);
    }
    const formatted = String(value).padStart(this.size, '0');
    return this.validateToStrSize(formatted);
  }
}