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