ironcalc 0.8.1

The democratization of spreadsheets
Documentation
use ironcalc_base::types::{
    Alignment, Border, BorderItem, Color, Fill, HorizontalAlignment, VerticalAlignment,
};

pub(crate) fn get_color_xml(color: &Color, name: &str) -> String {
    match color {
        Color::Rgb(s) => {
            let hex = s.trim_start_matches('#');
            format!("<{name} rgb=\"FF{hex}\"/>")
        }
        Color::Theme(idx, tint) => {
            if *tint == 0.0 {
                format!("<{name} theme=\"{idx}\"/>")
            } else {
                format!("<{name} theme=\"{idx}\" tint=\"{:.16}\"/>", tint)
            }
        }
        Color::None => "".to_string(),
    }
}

pub(crate) fn get_alignment(alignment: &Alignment) -> String {
    let wrap_text = if alignment.wrap_text {
        " wrapText=\"1\""
    } else {
        ""
    };
    let horizontal = if alignment.horizontal != HorizontalAlignment::default() {
        format!(" horizontal=\"{}\"", alignment.horizontal)
    } else {
        "".to_string()
    };
    let vertical = if alignment.vertical != VerticalAlignment::default() {
        format!(" vertical=\"{}\"", alignment.vertical)
    } else {
        "".to_string()
    };
    format!("<alignment{wrap_text}{horizontal}{vertical}/>")
}

fn get_border_xml_inner(border: &Option<BorderItem>, name: &str) -> String {
    if let Some(border_item) = border {
        let color = get_color_xml(&border_item.color, "color");
        return format!("<{name} style=\"{}\">{color}</{name}>", border_item.style);
    }
    format!("<{name}/>")
}

pub(crate) fn get_border_xml(border: &Border) -> String {
    let left = get_border_xml_inner(&border.left, "left");
    let right = get_border_xml_inner(&border.right, "right");
    let top = get_border_xml_inner(&border.top, "top");
    let bottom = get_border_xml_inner(&border.bottom, "bottom");
    let diagonal = get_border_xml_inner(&border.diagonal, "diagonal");
    format!("<border>{left}{right}{top}{bottom}{diagonal}</border>")
}

pub(crate) fn get_fill_xml(fill: &Fill) -> String {
    if fill.color.is_some() {
        let fg_color = get_color_xml(&fill.color, "fgColor");
        let bg_color = "<bgColor indexed=\"64\"/>".to_string();
        format!(
            "<fill><patternFill patternType=\"solid\">{fg_color}{bg_color}</patternFill></fill>"
        )
    } else {
        "<fill><patternFill patternType=\"none\"/></fill>".to_string()
    }
}

pub(crate) fn get_dxf_fill_xml(fill: &Fill) -> String {
    let bg_color = get_color_xml(&fill.color, "bgColor");
    format!("<fill><patternFill>{bg_color}</patternFill></fill>")
}