a1 1.0.1

A package for converting to and from A1 spreadsheet notation
Documentation
use super::RangeOrCell;
use std::fmt;

impl fmt::Display for RangeOrCell {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Self::Cell(p) => write!(f, "{p}"),
            Self::ColumnRange { from, to } => write!(f, "{from}:{to}"),
            Self::NonContiguous(range_or_cells) => {
                let joined_range_or_cells = range_or_cells
                    .iter()
                    .map(|r| r.to_string())
                    .collect::<Vec<_>>()
                    .join(", ");

                write!(f, "{joined_range_or_cells}")
            }
            Self::Range { from, to } => write!(f, "{from}:{to}"),
            Self::RowRange { from, to } => write!(f, "{from}:{to}"),
        }
    }
}

#[cfg(test)]
mod tests {
    use crate::*;

    #[test]
    fn display_cell() {
        assert_eq!(RangeOrCell::Cell(Address::new(0, 0)).to_string(), "A1");

        assert_eq!(
            RangeOrCell::Cell(Address::new(100, 100)).to_string(),
            "CW101"
        );
    }

    #[test]
    fn display_column_range() {
        assert_eq!(
            RangeOrCell::ColumnRange {
                from: Column::new(0),
                to: Column::new(10)
            }
            .to_string(),
            "A:K"
        );

        assert_eq!(
            RangeOrCell::ColumnRange {
                from: Column::new(5),
                to: Column::new(5)
            }
            .to_string(),
            "F:F"
        );
    }

    #[test]
    fn display_non_contiguous() {
        assert_eq!(
            RangeOrCell::NonContiguous(vec![
                RangeOrCell::Cell(Address::new(0, 0)),
                RangeOrCell::ColumnRange {
                    from: Column::new(0),
                    to: Column::new(10)
                },
                RangeOrCell::Range {
                    from: Address::new(0, 0),
                    to: Address::new(10, 10)
                },
            ])
            .to_string(),
            "A1, A:K, A1:K11"
        );
    }

    #[test]
    fn display_range() {
        assert_eq!(
            RangeOrCell::Range {
                from: Address::new(0, 0),
                to: Address::new(10, 10)
            }
            .to_string(),
            "A1:K11"
        );
    }

    #[test]
    fn display_row_range() {
        assert_eq!(
            RangeOrCell::RowRange {
                from: Row::new(0),
                to: Row::new(10)
            }
            .to_string(),
            "1:11"
        );

        assert_eq!(
            RangeOrCell::RowRange {
                from: Row::new(5),
                to: Row::new(5)
            }
            .to_string(),
            "6:6"
        );
    }
}