use crate::{interpreter::Instruction, IRecordType, IType};
use serde::Deserialize;
use serde::Serialize;
use std::str;
use std::sync::Arc;
#[derive(PartialEq, Eq, Debug, Clone, Hash, Serialize, Deserialize)]
pub enum TypeKind {
Function,
Record,
}
#[derive(PartialEq, Eq, Debug, Clone, Hash, Serialize, Deserialize)]
pub struct FunctionArg {
pub name: String,
pub ty: IType,
}
#[derive(PartialEq, Eq, Debug, Clone, Hash, Serialize, Deserialize)]
pub enum Type {
Function {
arguments: Arc<Vec<FunctionArg>>,
output_types: Arc<Vec<IType>>,
},
Record(Arc<IRecordType>),
}
#[derive(PartialEq, Eq, Debug, Default, Clone, Hash)]
pub struct Import<'input> {
pub namespace: &'input str,
pub name: &'input str,
pub function_type: u32,
}
#[derive(PartialEq, Eq, Debug, Default, Clone, Hash)]
pub struct Export<'input> {
pub name: &'input str,
pub function_type: u32,
}
#[derive(PartialEq, Eq, Debug, Clone, Hash, Serialize, Deserialize)]
pub struct Adapter {
pub function_type: u32,
pub instructions: Vec<Instruction>,
}
#[derive(PartialEq, Eq, Debug, Default, Clone, Hash, Serialize, Deserialize)]
pub struct Implementation {
pub core_function_type: u32,
pub adapter_function_type: u32,
}
#[derive(PartialEq, Eq, Debug, Clone, Hash, Serialize, Deserialize)]
pub enum InterfaceKind {
Version,
Type,
Import,
Adapter,
Export,
Implementation,
}
#[derive(PartialEq, Eq, Debug, Clone, Hash)]
pub struct Interfaces<'input> {
pub version: semver::Version,
pub types: Vec<Type>,
pub imports: Vec<Import<'input>>,
pub adapters: Vec<Adapter>,
pub exports: Vec<Export<'input>>,
pub implementations: Vec<Implementation>,
}
impl Interfaces<'_> {
pub fn new() -> Self {
use std::str::FromStr;
let version = semver::Version::from_str(env!("CARGO_PKG_VERSION")).unwrap();
Self {
version,
types: Vec::new(),
imports: Vec::new(),
adapters: Vec::new(),
exports: Vec::new(),
implementations: Vec::new(),
}
}
pub fn from_version(version: semver::Version) -> Self {
Self {
version,
types: Vec::new(),
imports: Vec::new(),
adapters: Vec::new(),
exports: Vec::new(),
implementations: Vec::new(),
}
}
}
impl Default for Interfaces<'_> {
fn default() -> Self {
Self::new()
}
}