fn from_str()

in crates/paimon/src/spec/types.rs [469:522]


    fn from_str(s: &str) -> Result<Self, Self::Err> {
        if !s.starts_with(serde_utils::DECIMAL::NAME) {
            return DataTypeInvalidSnafu {
                message: "Invalid DECIMAL type. Expected string to start with 'DECIMAL'.",
            }
            .fail();
        }

        let (open_bracket, close_bracket) = serde_utils::extract_brackets_pos(s, "DecimalType")?;
        let precision_scale_str = &s[open_bracket + 1..close_bracket];
        let (precision, scale) = match precision_scale_str
            .split(',')
            .collect::<Vec<&str>>()
            .as_slice()
        {
            [precision_str, scale_str] => {
                let precision =
                    precision_str
                        .trim()
                        .parse::<u32>()
                        .map_err(|_| Error::DataTypeInvalid {
                            message:
                                "Invalid DECIMAL precision. Unable to parse precision as a u32."
                                    .to_string(),
                        })?;
                let scale =
                    scale_str
                        .trim()
                        .parse::<u32>()
                        .map_err(|_| Error::DataTypeInvalid {
                            message: "Invalid DECIMAL scale. Unable to parse scale as a u32."
                                .to_string(),
                        })?;
                (precision, scale)
            }
            _ => {
                let precision = precision_scale_str.trim().parse::<u32>().map_err(|_| {
                    Error::DataTypeInvalid {
                        message: "Invalid DECIMAL precision. Unable to parse precision as a u32."
                            .to_string(),
                    }
                })?;
                (precision, DecimalType::DEFAULT_SCALE)
            }
        };

        let nullable = !s[close_bracket..].contains("NOT NULL");

        Ok(DecimalType {
            nullable,
            precision,
            scale,
        })
    }