diesel_derives/deprecated/
postgres_type.rs

1use syn::parse::{Parse, ParseStream, Result};
2use syn::punctuated::Punctuated;
3use syn::token::Comma;
4use syn::{parenthesized, Ident, LitInt, LitStr};
5
6use crate::deprecated::utils::parse_eq_and_lit_str;
7use crate::parsers::PostgresType;
8use crate::util::{unknown_attribute, POSTGRES_TYPE_NOTE};
9
10enum Attr {
11    Oid(Ident, LitInt),
12    ArrayOid(Ident, LitInt),
13    TypeName(Ident, LitStr),
14}
15
16impl Parse for Attr {
17    fn parse(input: ParseStream) -> Result<Self> {
18        let name: Ident = input.parse()?;
19        let name_str = name.to_string();
20
21        match &*name_str {
22            "oid" => Ok(Attr::Oid(name.clone(), {
23                let lit_str = parse_eq_and_lit_str(name, input, POSTGRES_TYPE_NOTE)?;
24                lit_str.parse()?
25            })),
26            "array_oid" => Ok(Attr::ArrayOid(name.clone(), {
27                let lit_str = parse_eq_and_lit_str(name, input, POSTGRES_TYPE_NOTE)?;
28                lit_str.parse()?
29            })),
30            "type_name" => Ok(Attr::TypeName(
31                name.clone(),
32                parse_eq_and_lit_str(name, input, POSTGRES_TYPE_NOTE)?,
33            )),
34
35            _ => Err(unknown_attribute(&name, &["oid", "array_oid", "type_name"])),
36        }
37    }
38}
39
40pub fn parse_postgres_type(name: Ident, input: ParseStream) -> Result<PostgresType> {
41    if input.is_empty() {
42        return Err(syn::Error::new(
43            name.span(),
44            format!(
45                "unexpected end of input, expected parentheses\n\
46                 help: The correct format looks like `#[diesel({POSTGRES_TYPE_NOTE})]`"
47            ),
48        ));
49    }
50
51    let content;
52    parenthesized!(content in input);
53
54    let mut oid = None;
55    let mut array_oid = None;
56    let mut type_name = None;
57
58    for attr in Punctuated::<Attr, Comma>::parse_terminated(&content)? {
59        match attr {
60            Attr::Oid(ident, value) => oid = Some((ident, value)),
61            Attr::ArrayOid(ident, value) => array_oid = Some((ident, value)),
62            Attr::TypeName(ident, value) => type_name = Some((ident, value)),
63        }
64    }
65
66    PostgresType::validate_and_build(&content, oid, array_oid, type_name, None)
67}