use super::{ArgumentError, Returns, ReturnsError, SqlMapping};
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub enum TypeOrigin {
ThisExtension,
External,
}
#[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub struct FunctionMetadataEntity<'a> {
pub arguments: Vec<FunctionMetadataTypeEntity<'a>>,
pub retval: FunctionMetadataTypeEntity<'a>,
pub path: &'a str,
}
#[derive(Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub struct FunctionMetadataTypeEntity<'a> {
pub resolution: Option<FunctionMetadataTypeResolutionEntity<'a>>,
pub argument_sql: Result<SqlMapping, ArgumentError>,
pub return_sql: Result<Returns, ReturnsError>,
}
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub struct FunctionMetadataTypeResolutionEntity<'a> {
pub type_ident: &'a str,
pub type_origin: TypeOrigin,
}
impl<'a> FunctionMetadataTypeEntity<'a> {
pub const fn resolved(
type_ident: &'a str,
type_origin: TypeOrigin,
argument_sql: Result<SqlMapping, ArgumentError>,
return_sql: Result<Returns, ReturnsError>,
) -> Self {
Self {
resolution: Some(FunctionMetadataTypeResolutionEntity { type_ident, type_origin }),
argument_sql,
return_sql,
}
}
pub const fn sql_only(
argument_sql: Result<SqlMapping, ArgumentError>,
return_sql: Result<Returns, ReturnsError>,
) -> Self {
Self { resolution: None, argument_sql, return_sql }
}
pub const fn type_ident(&self) -> Option<&'a str> {
match self.resolution {
Some(resolution) => Some(resolution.type_ident),
None => None,
}
}
pub const fn type_origin(&self) -> Option<TypeOrigin> {
match self.resolution {
Some(resolution) => Some(resolution.type_origin),
None => None,
}
}
pub const fn needs_type_resolution(&self) -> bool {
self.resolution.is_some()
}
}