collie_core/model/
feed.rs

1use 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}