tank-macros 0.26.0

Procedural macros for Tank: the Rust data layer. Not intended to be used directly.
Documentation
use crate::decode_column::ColumnMetadata;
use proc_macro2::TokenStream;
use quote::{ToTokens, quote};
use tank_core::{Value, future::Either, quote_btree_map, quote_option};

pub fn encode_column_def(metadata: &ColumnMetadata, column_ref: TokenStream) -> TokenStream {
    let column_type = quote_btree_map(&metadata.column_type);
    let ty = &metadata.ty;
    let value = if matches!(metadata.value, Value::Unknown(..)) {
        quote!(<#ty as ::tank::AsValue>::as_empty_value())
    } else {
        metadata.value.to_token_stream()
    };
    let nullable = &metadata.nullable;
    let default = metadata
        .default
        .as_ref()
        .map_or(quote!(Default::default()), |v| quote!(#v.into()));
    let primary_key = &metadata.primary_key;
    let clustering_key = metadata.clustering_key;
    let references = if let Some(Either::Left(tokens)) = &metadata.references {
        let tokens = tokens.clone();
        quote!(Some(#tokens))
    } else if let Some(Either::Right((table, column))) = &metadata.references {
        let (schema, table) = match table.rsplit_once('.') {
            Some((schema, table)) => (schema.to_string(), table.to_string()),
            _ => (String::new(), table.to_string()),
        };
        quote! {
            Some(::tank::ColumnRef {
                name: ::std::borrow::Cow::Borrowed(#column),
                table: ::std::borrow::Cow::Borrowed(#table),
                schema: ::std::borrow::Cow::Borrowed(#schema),
            })
        }
    } else {
        quote!(None)
    };
    let on_delete = quote_option(&metadata.on_delete);
    let on_update = quote_option(&metadata.on_update);
    let unique = &metadata.unique;
    let passive = &metadata.passive;
    let comment = &metadata.comment;
    quote! {
        ::tank::ColumnDef {
            column_ref: #column_ref,
            column_type: #column_type,
            value: #value,
            nullable: #nullable,
            default: #default,
            primary_key: #primary_key,
            clustering_key: #clustering_key,
            references: #references,
            on_delete: #on_delete,
            on_update: #on_update,
            unique: #unique,
            passive: #passive,
            comment: #comment,
        }
    }
}