Skip to content

Commit aacf9dd

Browse files
committed
add options to emit
1 parent a6f3826 commit aacf9dd

7 files changed

Lines changed: 98 additions & 60 deletions

File tree

src/hir/build.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,33 @@ use crate::{
22
api,
33
hir::{
44
ArrayType, BinaryStringType, BooleanType, EnumType, Event, Item, Length, MapType,
5-
NumberType, SetType, StructType, Type, Utf8StringType, VectorType,
5+
NumberType, SetType, StructType, Table, Type, Utf8StringType, VectorType,
66
},
77
shared::Range,
88
};
99

1010
impl From<api::Item> for Item {
1111
fn from(value: api::Item) -> Self {
1212
match value {
13-
api::Item::Table(table) => Item::Table(
14-
table
15-
.into_iter()
16-
.map(|(name, item)| (name, Item::from(item)))
17-
.collect(),
18-
),
19-
13+
api::Item::Table(table) => Item::Table(table.into()),
2014
api::Item::Event(event) => Item::Event(event.into()),
2115
}
2216
}
2317
}
2418

19+
impl From<api::Table> for Table {
20+
fn from(value: api::Table) -> Self {
21+
let options = value.options;
22+
let items = value
23+
.items
24+
.into_iter()
25+
.map(|(name, item)| (name, Item::from(item)))
26+
.collect();
27+
28+
Table { options, items }
29+
}
30+
}
31+
2532
impl From<api::Event> for Event {
2633
fn from(value: api::Event) -> Self {
2734
let uuid = value.uuid;

src/hir/mod.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
1+
use std::rc::Rc;
2+
13
use uuid::Uuid;
24

3-
use crate::shared::{NetworkSide, NumberKind, Range};
5+
use crate::shared::{NetworkSide, NumberKind, Options, Range};
46

57
mod build;
68
mod size;
79

810
#[derive(Clone)]
911
pub enum Item {
10-
Table(Vec<(String, Item)>),
12+
Table(Table),
1113
Event(Event),
1214
}
1315

16+
#[derive(Clone)]
17+
pub struct Table {
18+
pub options: Rc<Options>,
19+
pub items: Vec<(String, Item)>,
20+
}
21+
1422
#[derive(Clone)]
1523
pub struct Event {
1624
pub uuid: Uuid,

src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,18 @@ fn main() {
3030
match cli.command {
3131
Command::Run => {
3232
let source = std::fs::read("./zap/net.luau").expect("failed to read zap/net.luau");
33-
let items = match api::exec(&source) {
33+
let table = match api::exec(&source) {
3434
Ok(items) => items,
3535
Err(e) => {
3636
eprintln!("error: {e}");
3737
return;
3838
}
3939
};
4040

41-
let items = hir::Item::from(items);
41+
let table = hir::Table::from(table);
4242

43-
let server = mir::server(&items).unwrap();
44-
let client = mir::client(&items).unwrap();
43+
let server = mir::server(&table).unwrap();
44+
let client = mir::client(&table).unwrap();
4545

4646
std::fs::create_dir_all("./zap/out").expect("failed to create zap/out directory");
4747
std::fs::write("./zap/out/server.luau", server).expect("failed to write server code");

src/mir/client/mod.rs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
use std::rc::Rc;
2+
13
use crate::{
2-
hir::{Event, Item, Type},
4+
hir::{Event, Item, Table, Type},
35
mir::{
46
Expr,
57
builder::{Builder, InitVar},
68
serdes::{Des, Ser, Serdes},
79
},
8-
shared::{ApiCheck, NetworkSide},
10+
shared::{ApiCheck, NetworkSide, Options},
911
};
1012

1113
mod iter;
@@ -19,33 +21,37 @@ pub struct Client {
1921
pub des: Des,
2022
}
2123

22-
impl Client {
23-
pub fn new(apicheck: ApiCheck) -> Self {
24+
impl Default for Client {
25+
fn default() -> Self {
2426
let location = "result".to_string();
27+
2528
let ser = Ser {
26-
apicheck,
29+
options: Rc::new(Options::default()),
2730
native: false,
2831
};
32+
2933
let des = Des {
30-
apicheck,
34+
options: Rc::new(Options::default()),
3135
native: false,
3236
check: false,
3337
};
3438

3539
Client { location, ser, des }
3640
}
41+
}
3742

38-
pub fn item(&self, b: &mut Builder, item: &Item) {
43+
impl Client {
44+
fn item(&self, b: &mut Builder, item: &Item) {
3945
match item {
4046
Item::Table(table) => self.table(b, table),
4147
Item::Event(event) => self.event(b, event),
4248
}
4349
}
4450

45-
fn table(&self, b: &mut Builder, table: &[(String, Item)]) {
46-
for (name, item) in table {
51+
pub fn table(&self, b: &mut Builder, table: &Table) {
52+
for (name, item) in table.items.iter() {
4753
self.export(b, name, Expr::Table(vec![]));
48-
self.location(name).item(b, item);
54+
self.child(&table.options, name).item(b, item);
4955
}
5056
}
5157

@@ -56,12 +62,18 @@ impl Client {
5662
}
5763
}
5864

59-
fn location(&self, name: &str) -> Self {
65+
fn child(&self, options: &Rc<Options>, name: &str) -> Self {
66+
let mut ser = self.ser.clone();
67+
ser.options = Rc::clone(options);
68+
69+
let mut des = self.des.clone();
70+
des.options = Rc::clone(options);
71+
6072
Client {
6173
location: self.location.clone() + "." + name,
6274

63-
ser: self.ser.clone(),
64-
des: self.des.clone(),
75+
ser,
76+
des,
6577
}
6678
}
6779

src/mir/mod.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
use std::fmt::Display;
22

3-
use crate::{
4-
hir,
5-
shared::{ApiCheck, NumberKind},
6-
};
3+
use crate::{hir, shared::NumberKind};
74

85
mod builder;
96
mod client;
107
mod serdes;
118
mod server;
129

13-
pub fn server(items: &hir::Item) -> Result<String, std::fmt::Error> {
10+
pub fn server(table: &hir::Table) -> Result<String, std::fmt::Error> {
1411
use std::fmt::Write;
1512

1613
let mut b = builder::Builder::default();
17-
let server = server::Server::new(ApiCheck::Full);
14+
let server = server::Server::default();
1815

19-
server.item(&mut b, items);
16+
server.table(&mut b, table);
2017

2118
let mut s = String::new();
2219

@@ -31,13 +28,13 @@ pub fn server(items: &hir::Item) -> Result<String, std::fmt::Error> {
3128
Ok(s)
3229
}
3330

34-
pub fn client(items: &hir::Item) -> Result<String, std::fmt::Error> {
31+
pub fn client(table: &hir::Table) -> Result<String, std::fmt::Error> {
3532
use std::fmt::Write;
3633

3734
let mut b = builder::Builder::default();
38-
let client = client::Client::new(ApiCheck::Full);
35+
let client = client::Client::default();
3936

40-
client.item(&mut b, items);
37+
client.table(&mut b, table);
4138

4239
let mut s = String::new();
4340

src/mir/serdes.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use std::rc::Rc;
2+
13
use crate::{
24
hir,
35
mir::{
46
Expr, FuncD, FuncK,
57
builder::{Builder, InitVar},
68
},
7-
shared::{ApiCheck, NumberKind, Range},
9+
shared::{ApiCheck, NumberKind, Options, Range},
810
};
911

1012
fn check_type(b: &mut Builder, expr: impl Into<Expr>, ty: &'static str) {
@@ -43,40 +45,40 @@ fn check_utf8(b: &mut Builder, expr: impl Into<Expr>) {
4345

4446
#[derive(Clone)]
4547
pub struct Ser {
46-
pub apicheck: ApiCheck,
48+
pub options: Rc<Options>,
4749
pub native: bool,
4850
}
4951

5052
#[derive(Clone)]
5153
pub struct Des {
52-
pub apicheck: ApiCheck,
54+
pub options: Rc<Options>,
5355
pub native: bool,
5456
pub check: bool,
5557
}
5658

5759
macro_rules! apicheck_some {
5860
($serdes:expr, $block:block) => {
59-
if matches!($serdes.apicheck, ApiCheck::Some | ApiCheck::Full) {
61+
if matches!($serdes.options.apicheck(), ApiCheck::Some | ApiCheck::Full) {
6062
$block
6163
}
6264
};
6365

6466
($serdes:expr, $stmt:stmt) => {
65-
if matches!($serdes.apicheck, ApiCheck::Some | ApiCheck::Full) {
67+
if matches!($serdes.options.apicheck(), ApiCheck::Some | ApiCheck::Full) {
6668
$stmt
6769
}
6870
};
6971
}
7072

7173
macro_rules! apicheck_full {
7274
($serdes:expr, $block:block) => {
73-
if matches!($serdes.apicheck, ApiCheck::Full) {
75+
if matches!($serdes.options.apicheck(), ApiCheck::Full) {
7476
$block
7577
}
7678
};
7779

7880
($serdes:expr, $stmt:stmt) => {
79-
if matches!($serdes.apicheck, ApiCheck::Full) {
81+
if matches!($serdes.options.apicheck(), ApiCheck::Full) {
8082
$stmt
8183
}
8284
};

src/mir/server/mod.rs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
use std::rc::Rc;
2+
13
use crate::{
2-
hir::{Event, Item},
4+
hir::{Event, Item, Table},
35
mir::{
46
Expr,
57
builder::{Builder, InitVar},
68
serdes::{Des, Ser},
79
},
8-
shared::{ApiCheck, NetworkSide},
10+
shared::{ApiCheck, NetworkSide, Options},
911
};
1012

1113
mod iter;
@@ -19,33 +21,37 @@ pub struct Server {
1921
pub des: Des,
2022
}
2123

22-
impl Server {
23-
pub fn new(apicheck: ApiCheck) -> Self {
24+
impl Default for Server {
25+
fn default() -> Self {
2426
let location = "result".to_string();
27+
2528
let ser = Ser {
26-
apicheck,
27-
native: false,
29+
options: Rc::new(Options::default()),
30+
native: true,
2831
};
32+
2933
let des = Des {
30-
apicheck,
31-
native: false,
32-
check: false,
34+
options: Rc::new(Options::default()),
35+
native: true,
36+
check: true,
3337
};
3438

3539
Server { location, ser, des }
3640
}
41+
}
3742

38-
pub fn item(&self, b: &mut Builder, item: &Item) {
43+
impl Server {
44+
fn item(&self, b: &mut Builder, item: &Item) {
3945
match item {
4046
Item::Table(table) => self.table(b, table),
4147
Item::Event(event) => self.event(b, event),
4248
}
4349
}
4450

45-
fn table(&self, b: &mut Builder, table: &[(String, Item)]) {
46-
for (name, item) in table {
51+
pub fn table(&self, b: &mut Builder, table: &Table) {
52+
for (name, item) in table.items.iter() {
4753
self.export(b, name, Expr::Table(vec![]));
48-
self.location(name).item(b, item);
54+
self.child(&table.options, name).item(b, item);
4955
}
5056
}
5157

@@ -56,11 +62,17 @@ impl Server {
5662
}
5763
}
5864

59-
fn location(&self, name: &str) -> Self {
65+
fn child(&self, options: &Rc<Options>, name: &str) -> Self {
66+
let mut ser = self.ser.clone();
67+
ser.options = Rc::clone(&options);
68+
69+
let mut des = self.des.clone();
70+
des.options = Rc::clone(&options);
71+
6072
Server {
6173
location: self.location.clone() + "." + name,
62-
ser: self.ser.clone(),
63-
des: self.des.clone(),
74+
ser,
75+
des,
6476
}
6577
}
6678

0 commit comments

Comments
 (0)