diesel_derives/parsers/
sqlite_type.rs

1use syn::parse::{Parse, ParseStream, Result};
2use syn::punctuated::Punctuated;
3use syn::token::Comma;
4use syn::{Ident, LitStr};
5
6use crate::util::{parse_eq, unknown_attribute, SQLITE_TYPE_NOTE};
7
8enum Attr {
9    Name(LitStr),
10}
11
12impl Parse for Attr {
13    fn parse(input: ParseStream) -> Result<Self> {
14        let name: Ident = input.parse()?;
15        let name_str = name.to_string();
16
17        match &*name_str {
18            "name" => Ok(Attr::Name(parse_eq(input, SQLITE_TYPE_NOTE)?)),
19
20            _ => Err(unknown_attribute(&name, &["name"])),
21        }
22    }
23}
24
25pub struct SqliteType {
26    pub name: LitStr,
27}
28
29impl Parse for SqliteType {
30    fn parse(input: ParseStream) -> Result<Self> {
31        let mut name = None;
32
33        for attr in Punctuated::<Attr, Comma>::parse_terminated(input)? {
34            match attr {
35                Attr::Name(value) => name = Some(value),
36            }
37        }
38
39        if let Some(name) = name {
40            Ok(SqliteType { name })
41        } else {
42            Err(syn::Error::new(
43                input.span(),
44                format!(
45                    "expected attribute `name`\n\
46                     help: The correct format looks like #[diesel({})]",
47                    SQLITE_TYPE_NOTE
48                ),
49            ))
50        }
51    }
52}