use crate::{
instruction::GaiaInstruction,
types::{GaiaSignature, GaiaType},
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GaiaModule {
pub name: String,
pub functions: Vec<GaiaFunction>,
pub structs: Vec<GaiaStruct>,
pub classes: Vec<GaiaClass>,
pub constants: Vec<(String, GaiaConstant)>,
pub globals: Vec<GaiaGlobal>,
pub imports: Vec<GaiaImport>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct GaiaImport {
pub library: String,
pub symbol: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GaiaClass {
pub name: String,
pub parent: Option<String>,
pub interfaces: Vec<String>,
pub fields: Vec<GaiaField>,
pub methods: Vec<GaiaFunction>,
pub attributes: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct GaiaField {
pub name: String,
pub ty: GaiaType,
pub is_static: bool,
pub visibility: Visibility,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Visibility {
Public,
Private,
Protected,
Internal,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GaiaFunction {
pub name: String,
pub signature: GaiaSignature,
pub blocks: Vec<GaiaBlock>,
pub is_external: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GaiaBlock {
pub label: String,
pub instructions: Vec<GaiaInstruction>,
pub terminator: GaiaTerminator,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum GaiaTerminator {
Jump(String),
Branch {
true_label: String,
false_label: String,
},
Return,
Call {
callee: String,
args_count: usize,
next_block: String,
},
Halt,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct GaiaStruct {
pub name: String,
pub fields: Vec<(String, GaiaType)>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GaiaGlobal {
pub name: String,
pub ty: GaiaType,
pub initial_value: Option<GaiaConstant>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum GaiaConstant {
Bool(bool),
I8(i8),
U8(u8),
I16(i16),
U16(u16),
I32(i32),
U32(u32),
I64(i64),
U64(u64),
F32(f32),
F64(f64),
String(String),
Blob(Vec<u8>),
Array(Vec<GaiaConstant>),
Null,
}