hanzi-sort 0.1.1

Sort Chinese text by pinyin or stroke count, with polyphonic overrides and terminal-friendly output
use std::fs::File;
use std::io::{BufRead, BufReader};

use crate::config::InputSource;
use crate::error::{PinyinSortError, Result};

pub(crate) fn read_input_lines(source: &InputSource) -> Result<Vec<String>> {
    match source {
        InputSource::Files(paths) => {
            let mut items = Vec::new();
            for path in paths {
                let metadata = std::fs::metadata(path).map_err(|source| {
                    PinyinSortError::io(
                        format!("failed to inspect input path {}", path.display()),
                        source,
                    )
                })?;
                if metadata.is_dir() {
                    return Err(PinyinSortError::InvalidArgument(format!(
                        "directory inputs are not supported: {}",
                        path.display()
                    )));
                }

                let file = File::open(path).map_err(|source| {
                    PinyinSortError::io(
                        format!("failed to read input file {}", path.display()),
                        source,
                    )
                })?;
                for line in BufReader::new(file).lines() {
                    let line = line.map_err(|source| {
                        PinyinSortError::io(
                            format!("failed to read line from {}", path.display()),
                            source,
                        )
                    })?;
                    if !line.trim().is_empty() {
                        items.push(line);
                    }
                }
            }
            Ok(items)
        }
        InputSource::Text(items) => Ok(items
            .iter()
            .filter(|item| !item.trim().is_empty())
            .cloned()
            .collect()),
    }
}