hanzi-sort 0.1.1

Sort Chinese text by pinyin or stroke count, with polyphonic overrides and terminal-friendly output
use std::path::PathBuf;

use crate::error::{PinyinSortError, Result};
use crate::format::FormatConfig;
use crate::r#override::PinyinOverride;
use crate::sort::SortMode;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InputSource {
    Files(Vec<PathBuf>),
    Text(Vec<String>),
}

impl InputSource {
    pub fn is_empty(&self) -> bool {
        match self {
            Self::Files(paths) => paths.is_empty(),
            Self::Text(items) => items.is_empty(),
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RuntimeConfig {
    pub input: InputSource,
    pub format: FormatConfig,
    pub override_data: Option<PinyinOverride>,
    pub sort_mode: SortMode,
}

impl RuntimeConfig {
    pub fn new(
        input: InputSource,
        format: FormatConfig,
        override_data: Option<PinyinOverride>,
    ) -> Result<Self> {
        Self::with_sort_mode(input, format, override_data, SortMode::Pinyin)
    }

    pub fn with_sort_mode(
        input: InputSource,
        format: FormatConfig,
        override_data: Option<PinyinOverride>,
        sort_mode: SortMode,
    ) -> Result<Self> {
        if input.is_empty() {
            return Err(PinyinSortError::InvalidArgument(
                "at least one input file or text item is required".to_string(),
            ));
        }

        Ok(Self {
            input,
            format: format.validate()?,
            override_data,
            sort_mode,
        })
    }
}