collie_core/model/
feed.rs1use chrono::{DateTime, FixedOffset};
2use core::fmt;
3use rusqlite::Row;
4use serde::{Deserialize, Serialize};
5use std::{
6 fmt::{Display, Formatter},
7 str::FromStr,
8};
9
10use crate::error::Error;
11
12#[derive(Serialize, Deserialize, Debug, PartialEq)]
13pub enum FeedStatus {
14 Subscribed,
15 Unsubscribed,
16}
17
18impl Display for FeedStatus {
19 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
20 match self {
21 FeedStatus::Subscribed => write!(f, "subscribed"),
22 FeedStatus::Unsubscribed => write!(f, "unsubscribed"),
23 }
24 }
25}
26
27impl FromStr for FeedStatus {
28 type Err = Error;
29
30 fn from_str(x: &str) -> std::result::Result<Self, Self::Err> {
31 match x {
32 "subscribed" => Ok(Self::Subscribed),
33 "unsubscribed" => Ok(Self::Unsubscribed),
34 _ => Err(Error::InvalidEnumKey(
35 x.to_string(),
36 "FeedStatus".to_string(),
37 )),
38 }
39 }
40}
41
42#[derive(Serialize, Deserialize, Debug)]
43pub struct Feed {
44 pub id: i32,
45 pub title: String,
46 pub link: String,
47 pub status: FeedStatus,
48 pub checked_at: DateTime<FixedOffset>,
49 pub fetch_old_items: bool,
50}
51
52impl From<&Row<'_>> for Feed {
53 fn from(row: &Row) -> Self {
54 Self {
55 id: row.get_unwrap("id"),
56 title: row.get_unwrap("title"),
57 link: row.get_unwrap("link"),
58 status: FeedStatus::from_str(&row.get_unwrap::<&str, String>("status")).unwrap(),
59 checked_at: row.get_unwrap("checked_at"),
60 fetch_old_items: row.get_unwrap("fetch_old_items"),
61 }
62 }
63}
64
65#[derive(Serialize, Deserialize)]
66pub struct FeedToCreate {
67 pub title: String,
68 pub link: String,
69 pub fetch_old_items: bool,
70}
71
72#[derive(Serialize, Deserialize)]
73pub struct FeedToUpdate {
74 pub id: i32,
75 pub title: Option<String>,
76 pub link: Option<String>,
77 pub status: Option<FeedStatus>,
78 pub checked_at: Option<DateTime<FixedOffset>>,
79 pub fetch_old_items: Option<bool>,
80}