pgrx_sql_entity_graph/pg_extern/
cast.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//LICENSE Portions Copyright 2019-2021 ZomboDB, LLC.
//LICENSE
//LICENSE Portions Copyright 2021-2023 Technology Concepts & Design, Inc.
//LICENSE
//LICENSE Portions Copyright 2023-2023 PgCentral Foundation, Inc. <contact@pgcentral.org>
//LICENSE
//LICENSE All rights reserved.
//LICENSE
//LICENSE Use of this source code is governed by the MIT license that can be found in the LICENSE file.
/*!

`#[pg_cast]` related macro expansion for Rust to SQL translation

> Like all of the [`sql_entity_graph`][crate] APIs, this is considered **internal**
> to the `pgrx` framework and very subject to change between versions. While you may use this, please do it with caution.

*/
use proc_macro2::TokenStream as TokenStream2;
use quote::{quote, ToTokens, TokenStreamExt};
use syn::Path;

/// A parsed `#[pg_cast]` operator.
///
/// It is created during [`PgExtern`](crate::PgExtern) parsing.
#[derive(Debug, Clone, Default)]
pub enum PgCast {
    #[default]
    Default,
    Assignment,
    Implicit,
}

pub type InvalidCastStyle = Path;

impl TryFrom<Path> for PgCast {
    type Error = InvalidCastStyle;

    fn try_from(path: Path) -> Result<Self, Self::Error> {
        if path.is_ident("implicit") {
            Ok(Self::Implicit)
        } else if path.is_ident("assignment") {
            Ok(Self::Assignment)
        } else {
            Err(path)
        }
    }
}

impl ToTokens for PgCast {
    fn to_tokens(&self, tokens: &mut TokenStream2) {
        let quoted = match self {
            PgCast::Default => quote! {
                ::pgrx::pgrx_sql_entity_graph::PgCastEntity::Default
            },
            PgCast::Assignment => quote! {
                ::pgrx::pgrx_sql_entity_graph::PgCastEntity::Assignment
            },
            PgCast::Implicit => quote! {
                ::pgrx::pgrx_sql_entity_graph::PgCastEntity::Implicit
            },
        };
        tokens.append_all(quoted);
    }
}