use ril::prelude::*; use std::fs::File; struct Template> { elements: Vec>, dimensions: (u32, u32), base: Image, } impl> Template { pub fn new(elements: Vec>) -> Self { Self { elements, } } pub fn produce(self, image: File) -> Result { for element in self.elements { image.draw } } } struct Element> { position: (i32, i32), dimensions: (u32, u32), media: Media, } impl> Element { pub fn new(media: Media, position: (i32, i32), dimensions: (u32, u32)) -> Self { Self { position, dimensions, media, } } } impl> Into for Element { pub fn into(self) -> Image { match self.media { Media::Image(image) => { image.resized(self.dimensions.0, self.dimensions.1, ResizeAlgorithm::Bicubic) }, Media::Text(text) => { Image::new(self.dimensions.0, self.dimensions.1, Rgba::transparent()) .with(TextSegment::new(text.font, text.text, Rgb::new(text.fill.0, text.fill.1, text.fill.2)) .with_size(text.size)) }, } } } pub enum Media> { Text(Text), Image(Image), } struct Text> { text: T, font: File, size: f32, fill: (u8, u8, u8), } impl> Text { pub fn new(contents: T, font: File, size: f32, fill: (u8, u8, u8)) -> Self { Self { contents, font, size, fill, } } } #[cfg(test)] mod tests { #[test] fn it_works() { let result = 2 + 2; assert_eq!(result, 4); } }