autopulse_service/settings/triggers/
readarr.rs1use crate::settings::rewrite::Rewrite;
2use crate::settings::timer::{EventTimers, Timer};
3use crate::settings::triggers::TriggerRequest;
4use serde::{Deserialize, Serialize};
5
6#[derive(Serialize, Deserialize, Clone)]
7pub struct Readarr {
8 pub rewrite: Option<Rewrite>,
10 pub timer: Option<Timer>,
12 #[serde(default)]
14 pub excludes: Vec<String>,
15 pub event_timers: Option<EventTimers>,
17}
18
19#[derive(Deserialize, Clone)]
20#[serde(rename_all = "camelCase")]
21#[doc(hidden)]
22pub struct BookFile {
23 path: String,
24}
25
26#[derive(Deserialize, Clone)]
27#[serde(rename_all = "camelCase")]
28#[doc(hidden)]
29pub struct RenamedBookFile {
30 path: String,
31 previous_path: String,
32}
33
34#[derive(Deserialize, Clone)]
35#[serde(rename_all = "camelCase")]
36#[doc(hidden)]
37pub struct Author {
38 path: String,
39}
40
41#[derive(Deserialize, Clone)]
43#[serde(tag = "eventType")]
44#[doc(hidden)]
45pub enum ReadarrRequest {
46 #[serde(rename = "Download")]
47 #[serde(rename_all = "camelCase")]
48 Download { book_files: Vec<BookFile> },
49 #[serde(rename = "Rename")]
50 #[serde(rename_all = "camelCase")]
51 Rename {
52 renamed_book_files: Vec<RenamedBookFile>,
53 },
54 #[serde(rename = "AuthorDelete")]
55 #[serde(rename_all = "camelCase")]
56 AuthorDelete { author: Author },
57 #[serde(rename = "BookDelete")]
58 #[serde(rename_all = "camelCase")]
59 BookDelete { author: Author },
60 #[serde(rename = "BookFileDelete")]
61 #[serde(rename_all = "camelCase")]
62 BookFileDelete { book_file: BookFile },
63 #[serde(rename = "Test")]
64 Test,
65}
66
67impl TriggerRequest for ReadarrRequest {
68 fn from_json(json: serde_json::Value) -> anyhow::Result<Self> {
69 serde_json::from_value(json).map_err(|e| anyhow::anyhow!(e))
70 }
71 fn paths(&self) -> Vec<(String, bool)> {
72 match self {
73 Self::Download { book_files } => book_files
74 .iter()
75 .map(|book_file| (book_file.path.clone(), true))
76 .collect(),
77 Self::Rename { renamed_book_files } => {
78 let mut paths = vec![];
79
80 for file in renamed_book_files {
81 paths.push((file.previous_path.clone(), false));
82 paths.push((file.path.clone(), true));
83 }
84
85 paths
86 }
87 Self::AuthorDelete { author } | Self::BookDelete { author } => {
88 vec![(author.path.clone(), false)]
89 }
90 Self::BookFileDelete { book_file } => {
91 vec![(book_file.path.clone(), false)]
92 }
93 Self::Test => vec![],
94 }
95 }
96}