reproto-backend-python 0.3.23

Rethinking Protocol Generators
use genco::{Cons, Element, IntoTokens, Python, Quoted, Tokens};

pub struct BlockComment<'el>(pub &'el [String]);

impl<'el> IntoTokens<'el, Python<'el>> for BlockComment<'el> {
    fn into_tokens(self) -> Tokens<'el, Python<'el>> {
        let c: Tokens<'el, Python<'el>> = self.0
            .iter()
            .map(|c| Element::Literal(c.as_str().into()))
            .collect();

        let mut toks = Tokens::new();

        toks.push("\"\"\"");
        toks.push(c.join(Element::Line));
        toks.push("\"\"\"");

        toks
    }
}

pub struct IfNoneThen<C, D>(pub C, pub D);

impl<'el, C, D> IntoTokens<'el, Python<'el>> for IfNoneThen<C, D>
where
    C: Into<Tokens<'el, Python<'el>>>,
    D: Into<Tokens<'el, Python<'el>>>,
{
    fn into_tokens(self) -> Tokens<'el, Python<'el>> {
        let mut toks = Tokens::new();

        let cond = self.0.into();
        let def = self.1.into();

        toks.push(toks!["if ", cond.clone(), " is None:"]);
        toks.nested(toks![cond, " = ", def]);

        toks
    }
}

pub struct IfNoneRaise<C, M>(pub C, pub M);

impl<'el, C, M> IntoTokens<'el, Python<'el>> for IfNoneRaise<C, M>
where
    C: Into<Tokens<'el, Python<'el>>>,
    M: Into<Cons<'el>>,
{
    fn into_tokens(self) -> Tokens<'el, Python<'el>> {
        let mut toks = Tokens::new();

        toks.push(toks!["if ", self.0.into(), " is None:"]);
        toks.nested(toks!["raise Exception(", self.1.into().quoted(), ")"]);

        toks
    }
}