parker 0.0.0

Minimalist web framework for templatized rendering
Documentation
use bson::Document;

use crate::doc::DatabaseDocument;

#[derive(Debug, PartialEq, Serialize, Deserialize)]
pub struct Webpage {
    pub route: String,
    pub view: String,
    #[serde(flatten)]
    pub context: Document,
}

impl DatabaseDocument for Webpage {
    const COLLECTION_NAME: &'static str = "pages";
    type QueryData = String; // TODO: Fix this type

    fn gen_query(route: &Self::QueryData) -> Document {
        doc! { "route" => route }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    fn make_page() -> Webpage {
        Webpage {
            route: "index".to_string(),
            view: "page".to_string(),
            context: doc! { "title" => "Website" },
        }
    }

    #[test]
    fn test_to_bson() {
        let page = make_page();
        let encoded = page.to_bson();
        let expected = doc! {
            "route" => &page.route,
            "view" => &page.view,
            "title" => "Website",
        };

        assert_eq!(
            expected, encoded,
            "Expected encoded webpage to equal BSON value"
        );
    }

    #[test]
    fn test_from_bson() {
        let expected = make_page();
        let doc: Document = doc! {
            "route" => &expected.route,
            "view" => &expected.view,
            "title" => "Website",
        };
        let decoded = Webpage::from_bson(doc);

        assert!(decoded.is_ok(), "Expected decoding to succeed");
        assert_eq!(
            expected,
            decoded.unwrap(),
            "Expected decoded BSON to equal original Webpage"
        );
    }
}