1use gaia_types::{GaiaError, QualifiedName};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Default)]
6pub struct NyarProgram {
7 pub module: NyarModule,
9}
10
11impl NyarProgram {
12 pub fn new() -> Self {
14 Self::default()
15 }
16
17 pub fn set_name(&mut self, name: QualifiedName) {
19 self.module.name = name;
20 }
21
22 pub fn into_module(self) -> NyarModule {
24 self.module
25 }
26}
27
28#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
30pub struct NyarHandler {
31 pub start: u32,
32 pub end: u32,
33 pub target: u32,
34 pub error_type: u16,
35}
36
37#[derive(Debug, Serialize, Deserialize)]
38pub struct NyarChunk {
39 pub code: Vec<u8>,
40 pub locals: u16,
41 pub upvalues: u16,
42 pub max_stack: u16,
43 pub handlers: Vec<NyarHandler>,
44 pub lines: Vec<(u32, u32)>,
45}
46
47impl Clone for NyarChunk {
48 fn clone(&self) -> Self {
49 Self {
50 code: self.code.clone(),
51 locals: self.locals,
52 upvalues: self.upvalues,
53 max_stack: self.max_stack,
54 handlers: self.handlers.clone(),
55 lines: self.lines.clone(),
56 }
57 }
58}
59
60impl Default for NyarChunk {
61 fn default() -> Self {
62 Self { code: Vec::new(), locals: 0, upvalues: 0, max_stack: 0, handlers: Vec::new(), lines: Vec::new() }
63 }
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct NyarModule {
68 pub name: QualifiedName,
69 pub version: u16,
70 pub flags: u32,
71 pub timestamp: u64,
72 pub constants: Vec<NyarConstant>,
73 pub effects: Vec<QualifiedName>,
74 pub chunks: Vec<NyarChunk>,
75 pub classes: Vec<NyarClassInfo>,
76 pub traits: Vec<NyarTraitInfo>,
77 pub impls: Vec<NyarImplInfo>,
78 pub imports: Vec<NyarImportInfo>,
79 pub exports: Vec<NyarExportInfo>,
80}
81
82impl Default for NyarModule {
83 fn default() -> Self {
84 Self {
85 name: QualifiedName::new(vec![], "main".to_string()),
86 version: 1,
87 flags: 0,
88 timestamp: 0,
89 constants: Vec::new(),
90 effects: Vec::new(),
91 chunks: Vec::new(),
92 classes: Vec::new(),
93 traits: Vec::new(),
94 impls: Vec::new(),
95 imports: Vec::new(),
96 exports: Vec::new(),
97 }
98 }
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
103#[serde(tag = "kind", content = "value")]
104pub enum NyarConstant {
105 None,
107 Int(i64),
109 Float(u64), String(String),
113 QualifiedName(QualifiedName),
115}
116
117impl NyarConstant {
118 pub fn float(f: f64) -> Self {
119 Self::Float(f.to_bits())
120 }
121 pub fn get_float(&self) -> Option<f64> {
122 if let Self::Float(v) = self {
123 Some(f64::from_bits(*v))
124 }
125 else {
126 None
127 }
128 }
129}
130
131#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
133pub struct NyarClassInfo {
134 pub name: QualifiedName,
135 pub fields: Vec<String>,
136}
137
138#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
140pub struct NyarTraitInfo {
141 pub name: QualifiedName,
142 pub methods: Vec<String>,
143}
144
145#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
147pub struct NyarImplInfo {
148 pub class_idx: u16,
149 pub trait_idx: u16,
150 pub methods: Vec<u16>,
151}
152
153#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
155pub struct NyarImportInfo {
156 pub provider: String,
157 pub symbol: QualifiedName,
158}
159
160#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
162pub struct NyarExportInfo {
163 pub symbol: QualifiedName,
164 pub chunk_idx: u16,
165}