use proc_macro2::TokenStream as TokenStream2;
use quote::{ToTokens, TokenStreamExt, quote};
use syn::Path;
#[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);
}
}
impl PgCast {
pub fn section_len_tokens(&self) -> TokenStream2 {
quote! { ::pgrx::pgrx_sql_entity_graph::section::u8_len() }
}
pub fn section_writer_tokens(&self, writer: TokenStream2) -> TokenStream2 {
match self {
PgCast::Default => quote! {
#writer.u8(::pgrx::pgrx_sql_entity_graph::section::OPERATOR_CAST_DEFAULT)
},
PgCast::Assignment => quote! {
#writer.u8(::pgrx::pgrx_sql_entity_graph::section::OPERATOR_CAST_ASSIGNMENT)
},
PgCast::Implicit => quote! {
#writer.u8(::pgrx::pgrx_sql_entity_graph::section::OPERATOR_CAST_IMPLICIT)
},
}
}
}