use aluvm::regs::Reg;
use aluvm::LibSite;
use amplify::confinement::{SmallOrdMap, TinyOrdMap, TinyOrdSet, TinyString, TinyVec};
use strict_encoding::Ident;
use strict_types::SemId;
pub type CallName = Ident;
pub type OwnedStateName = Ident;
pub type FreeStateName = Ident;
pub type ErrorName = Ident;
pub type InputName = Ident;
pub type IfaceName = Ident;
pub struct OpAbi {
pub spent: TinyOrdSet<OwnedStateName>,
pub input: TinyOrdMap<InputName, SemId>,
pub assignments: TinyOrdMap<InputName, SemId>,
}
pub struct ReaderAbi {
pub script: Option<LibSite>,
pub return_ty: SemId,
pub return_reg: Reg,
}
pub struct IfaceDecl {
pub name: IfaceName,
pub inherited: TinyVec<IfaceDecl>,
pub extension: Interface,
}
pub struct Interface {
pub readers: SmallOrdMap<CallName, ReaderAbi>,
pub errors: SmallOrdMap<ErrorName, TinyString>,
pub ops: SmallOrdMap<CallName, OpAbi>,
}
pub struct AdaptorCall {
pub script: LibSite,
pub strict_reg: Reg,
pub fiel_array_start: Reg,
}
pub struct TypeAdaptor {
pub sem_id: SemId,
pub strict_to_fiel: AdaptorCall,
pub fiel_to_strict: AdaptorCall,
}
pub struct Contract {
pub implements: TinyVec<IfaceDecl>,
pub errors: SmallOrdMap<u16, ErrorName>,
pub free_state: TinyOrdMap<FreeStateName, SemId>,
pub owned_state: TinyOrdMap<OwnedStateName, SemId>,
pub ops: SmallOrdMap<CallName, OpAbi>,
}