use proc_macro2::TokenStream;
use crate::{asg::{Type, TypeArgument}, PartialType, ScalarType, PartialScalarType};
pub type ForeignTypeObj = Box<dyn ForeignType + 'static>;
pub trait ForeignType {
fn assignable_from(&self, type_: &Type) -> bool;
fn assignable_to(&self, type_: &Type) -> bool;
fn assignable_from_partial(&self, type_: &PartialType) -> bool {
match type_ {
PartialType::Type(t) => self.assignable_from(t),
PartialType::Any => true,
PartialType::Scalar(PartialScalarType::Some(scalar)) |
PartialType::Scalar(PartialScalarType::Defaults(scalar))
=> self.assignable_from(&Type::Scalar(*scalar)),
_ => false,
}
}
fn assignable_to_partial(&self, type_: &PartialType) -> bool {
match type_ {
PartialType::Type(t) => self.assignable_to(t),
PartialType::Any => true,
PartialType::Scalar(PartialScalarType::Some(scalar)) |
PartialType::Scalar(PartialScalarType::Defaults(scalar))
=> self.assignable_to(&Type::Scalar(*scalar)),
_ => false,
}
}
fn type_ref(&self) -> TokenStream;
fn decoding_gen(
&self,
source: TokenStream,
output_ref: TokenStream,
arguments: Vec<TokenStream>,
is_async: bool,
) -> TokenStream;
fn encoding_gen(
&self,
target: TokenStream,
field_ref: TokenStream,
arguments: Vec<TokenStream>,
is_async: bool,
) -> TokenStream;
fn arguments(&self) -> Vec<TypeArgument>;
fn can_receive_auto(&self) -> Option<ScalarType>;
}