feedly_api 0.7.0

rust implementation of the feedly REST API
Documentation
use super::Subscription;
use crate::ApiError;
use serde_derive::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Collection {
    pub id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub label: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub description: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub feeds: Option<Vec<Subscription>>,
}

impl Collection {
    pub fn decompose(
        self,
    ) -> (
        String,
        Option<String>,
        Option<String>,
        Option<Vec<Subscription>>,
    ) {
        (self.id, self.label, self.description, self.feeds)
    }

    pub fn manual_deserialize(data: &Value) -> Result<Collection, ApiError> {
        let id = data["id"].as_str().ok_or(ApiError::ManualJson)?.into();

        let label = data["label"].as_str().map(|t| t.into());

        let description = data["description"].as_str().map(|t| t.into());

        let feeds = serde_json::from_value(data["feeds"].clone()).ok();

        Ok(Collection {
            id,
            label,
            description,
            feeds,
        })
    }

    pub fn manual_deserialize_vec(data: &Value) -> Result<Vec<Collection>, ApiError> {
        let mut collections = Vec::new();

        let vector = match data.as_array() {
            Some(vector) => vector,
            None => return Ok(collections),
        };

        for collection_value in vector {
            collections.push(Self::manual_deserialize(collection_value)?);
        }

        Ok(collections)
    }
}

#[derive(Clone, Debug, Serialize)]
pub struct CollectionInput {
    pub label: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub feeds: Option<Vec<CollectionFeedInput>>,
}

#[derive(Clone, Debug, Serialize)]
pub struct CollectionFeedInput {
    pub id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,
}