eureka_mmanager_core/data_push/chapter/
image.rs

1use std::{
2    fs::File,
3    io::{self, BufWriter, Read, Write},
4};
5
6use uuid::Uuid;
7
8use crate::{data_push::Push, DirsOptions};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
11pub enum Mode {
12    Data,
13    DataSaver,
14}
15
16impl Default for Mode {
17    fn default() -> Self {
18        Self::Data
19    }
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
23pub struct ChapterImagePushEntry<R> {
24    filename: String,
25    reader: R,
26    id: Uuid,
27    mode: Mode,
28}
29
30impl<R> ChapterImagePushEntry<R> {
31    pub fn new(id: Uuid, filename: String, reader: R) -> Self {
32        Self {
33            filename,
34            reader,
35            id,
36            mode: Default::default(),
37        }
38    }
39    pub fn id<I: Into<Uuid>>(self, id: I) -> Self {
40        Self {
41            id: id.into(),
42            ..self
43        }
44    }
45    pub fn filename<F: Into<String>>(self, filename: F) -> Self {
46        Self {
47            filename: filename.into(),
48            ..self
49        }
50    }
51    pub fn reader(self, reader: R) -> Self {
52        Self { reader, ..self }
53    }
54    pub fn mode<M: Into<Mode>>(self, mode: M) -> Self {
55        Self {
56            mode: mode.into(),
57            ..self
58        }
59    }
60}
61
62impl<R> Push<ChapterImagePushEntry<R>> for DirsOptions
63where
64    R: Read,
65{
66    type Error = crate::Error;
67    fn push(&mut self, mut data: ChapterImagePushEntry<R>) -> crate::ManagerCoreResult<()> {
68        let mut file = match data.mode {
69            Mode::Data => BufWriter::new(File::create(
70                self.chapters_id_data_add(data.id).join(data.filename),
71            )?),
72            Mode::DataSaver => BufWriter::new(File::create(
73                self.chapters_id_data_saver_add(data.id).join(data.filename),
74            )?),
75        };
76        {
77            io::copy(&mut data.reader, &mut file)?;
78        }
79        file.flush()?;
80        Ok(())
81    }
82}
83
84impl<R> Push<Vec<ChapterImagePushEntry<R>>> for DirsOptions
85where
86    R: Read,
87{
88    type Error = crate::Error;
89    fn push(&mut self, data: Vec<ChapterImagePushEntry<R>>) -> crate::ManagerCoreResult<()> {
90        for image in data {
91            self.push(image)?;
92        }
93        Ok(())
94    }
95}