dars-macros 0.1.0

Declarative Agents in Rust
Documentation
use syn::{
    Lit,
    parse::{Parse, ParseStream},
};

#[derive(Debug)]
pub struct Args {
    args: Option<String>,
}

impl Parse for Args {
    fn parse(input: ParseStream) -> syn::Result<Self> {
        let mut args = String::new();
        while let Ok(lit) = input.parse::<Lit>() {
            match lit {
                Lit::Str(str) => {
                    for line in str.value().lines() {
                        let line = line.trim();
                        if !line.is_empty() {
                            args.push_str(line);
                            args.push('\n');
                        }
                    }
                }
                _ => return Err(syn::Error::new(lit.span(), "Expected string literal")),
            }
        }

        Ok(Args {
            args: (!args.is_empty()).then_some(args),
        })
    }
}

impl Into<Option<String>> for Args {
    fn into(self) -> Option<String> {
        self.args
    }
}