icns_rs/
lib.rs

1pub mod builder;
2pub mod encode;
3pub mod formats;
4pub mod packbits;
5
6use builder::ImageBuilder;
7use encode::IconFamily;
8pub use formats::IconFormats;
9use image::DynamicImage;
10
11/// The main encoder struct
12/// Create a new encoder with `IcnsEncoder::new()`
13pub struct IcnsEncoder {
14    data: DynamicImage,
15    formats: Vec<IconFormats>,
16}
17
18impl IcnsEncoder {
19    /// Creates a new IcnsEncoder
20    ///
21    /// Usage:
22    /// ```no_run
23    /// use icns_rs::{IcnsEncoder, IconFormats};
24    /// use image::open;
25    /// use std::fs::File;
26    /// use std::io::prelude::*;
27    ///
28    /// // Open the image
29    /// let image = match open("512x512@2.png") {
30    ///     Ok(image) => image,
31    ///     Err(e) => {
32    ///         println!("Error: {}", e);
33    ///         std::process::exit(1);
34    ///     }
35    /// };
36    ///
37    /// // Create the encoder
38    /// let mut encoder = IcnsEncoder::new();
39    ///
40    /// encoder.data(image);
41    /// encoder.formats(IconFormats::recommended());
42    ///
43    /// // Encode the image
44    /// let data = match encoder.build() {
45    ///     Ok(data) => data,
46    ///     Err(e) => {
47    ///         println!("Error ould not encode image");
48    ///         std::process::exit(1);
49    ///     }
50    /// };
51    ///
52    /// // Write data to file
53    /// let mut file = match File::create("example.icns") {
54    ///     Ok(file) => file,
55    ///     Err(e) => {
56    ///         println!("Error: {}", e);
57    ///         std::process::exit(1);
58    ///     }
59    /// };
60    ///
61    /// match file.write_all(&data) {
62    ///     Ok(_) => println!("Successfully wrote to file"),
63    ///     Err(e) => {
64    ///         println!("Error: {}", e);
65    ///         std::process::exit(1);
66    ///     }
67    /// };
68    /// ```
69    pub fn new() -> Self {
70        Self {
71            data: DynamicImage::new_rgb8(1, 1),
72            formats: Vec::new(),
73        }
74    }
75
76    /// Sets the image data. Encode a png and pass it as a DynamicImage.
77    pub fn data(&mut self, data: DynamicImage) -> &mut Self {
78        self.data = data;
79
80        self
81    }
82
83    /// Sets the image formats to be encoded
84    pub fn formats(&mut self, formats: Vec<IconFormats>) -> &mut Self {
85        self.formats = formats;
86
87        self
88    }
89
90    /// Encodes the image as an ICNS file
91    pub fn build(&self) -> Result<Box<[u8]>, String> {
92        let mut file = IconFamily::new();
93
94        let mut image_encoder = ImageBuilder::new();
95        image_encoder.data(self.data.clone());
96
97        for format in &self.formats {
98            let image = image_encoder.format(format.clone()).build()?;
99
100            file.add_data(image);
101        }
102
103        Ok(file.build())
104    }
105}