use std::fmt;
use super::{Border, ColorKind};
use crate::{ImgGenSpecError, Result};
#[cfg(feature = "pyo3")]
use pyo3::prelude::*;
use serde::Deserialize;
#[cfg_attr(
feature = "pyo3",
pyclass(eq, eq_int, module = "img_gen", from_py_object)
)]
#[derive(Debug, PartialEq, Clone, Copy, Deserialize)]
pub enum Corners {
#[serde(alias = "top left")]
TopLeft,
#[serde(alias = "top right")]
TopRight,
#[serde(alias = "bottom left")]
BottomLeft,
#[serde(alias = "bottom right")]
BottomRight,
}
impl Corners {
pub fn from_string(val: &str) -> Result<Self> {
match val.to_lowercase().as_str() {
"top left" => Ok(Corners::TopLeft),
"top right" => Ok(Corners::TopRight),
"bottom left" => Ok(Corners::BottomLeft),
"bottom right" => Ok(Corners::BottomRight),
_ => Err(ImgGenSpecError::InvalidCornerIdentifier {
value: val.to_string(),
}),
}
}
pub const ALL: [Self; 4] = [
Corners::TopLeft,
Corners::TopRight,
Corners::BottomLeft,
Corners::BottomRight,
];
}
impl fmt::Display for Corners {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Corners::TopLeft => write!(f, "top left"),
Corners::TopRight => write!(f, "top right"),
Corners::BottomLeft => write!(f, "bottom left"),
Corners::BottomRight => write!(f, "bottom right"),
}
}
}
#[cfg_attr(
feature = "pyo3",
pyclass(module = "img_gen", get_all, set_all, from_py_object)
)]
#[derive(Debug, Clone, Default, Deserialize)]
pub struct Rectangle {
pub border: Option<Border>,
#[serde(default = "ColorKind::transparent_default")]
pub color: ColorKind,
#[serde(default)]
pub radius: f32,
#[serde(default)]
pub corners: Vec<Corners>,
}
#[cfg(test)]
mod test {
#![allow(clippy::unwrap_used)]
use super::Corners;
#[test]
fn test_str() {
let str_values = ["top left", "top right", "bottom right", "bottom left"];
for str_val in str_values {
let val = Corners::from_string(str_val);
assert!(val.is_ok());
assert_eq!(val.unwrap().to_string(), str_val);
}
assert!(Corners::from_string("val").is_err());
}
}