eureka_mmanager_core/data_push/chapter/
image.rs1use 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}