Skip to content

Commit f0cc67d

Browse files
committed
export correct types
1 parent 75e43ea commit f0cc67d

11 files changed

Lines changed: 351 additions & 114 deletions

File tree

src/hir/buckets.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use std::collections::HashMap;
2+
3+
use crate::{
4+
hir::{Hir, Item, Table},
5+
shared::Remote,
6+
};
7+
8+
pub type Buckets<'hir> = HashMap<Remote, Vec<(String, &'hir Item)>>;
9+
10+
impl Hir {
11+
pub fn buckets(&self) -> Buckets {
12+
fn visit<'hir>(
13+
buckets: &mut HashMap<Remote, Vec<(String, &'hir Item)>>,
14+
table: &'hir Table,
15+
path: String,
16+
) {
17+
for (name, item) in table.items.iter() {
18+
let path = format!("{path}.{name}");
19+
20+
match item {
21+
Item::Table(table) => visit(buckets, table, path),
22+
Item::Event(event) => buckets
23+
.entry(event.thru.clone())
24+
.or_default()
25+
.push((path, item)),
26+
}
27+
}
28+
}
29+
30+
let mut buckets = HashMap::new();
31+
visit(&mut buckets, &self.table, String::new());
32+
33+
buckets
34+
}
35+
}

src/hir/build.rs

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,39 @@
1-
use std::collections::HashMap;
2-
31
use crate::{
42
api,
53
hir::{
64
ArrayType, BinaryStringType, BooleanType, EnumType, Event, Hir, Item, Length, MapType,
7-
NumberType, SetType, StructType, Type, Utf8StringType, VectorType,
5+
NumberType, SetType, StructType, Table, Type, Utf8StringType, VectorType,
86
},
9-
shared::{Range, Remote},
7+
shared::Range,
108
};
119

1210
pub fn build(table: api::Table) -> Hir {
13-
fn build(buckets: &mut HashMap<Remote, Vec<Item>>, path: String, table: api::Table) {
14-
let opts = table.opts.resolved();
15-
16-
for (name, item) in table.items {
17-
let path = format!("{path}.{name}");
18-
19-
match item {
20-
api::Item::Table(table) => build(buckets, path, table),
21-
22-
api::Item::Event(api::Event { thru, from, data }) => {
23-
let data = data.into_iter().map(Type::from).collect();
24-
25-
let event = Event {
26-
opts: opts.clone(),
27-
path,
28-
from,
29-
data,
30-
};
31-
32-
buckets
33-
.entry(thru.clone())
34-
.or_default()
35-
.push(Item::Event(event));
36-
}
37-
}
38-
}
11+
Hir {
12+
table: table.into(),
3913
}
14+
}
4015

41-
let mut buckets = HashMap::new();
42-
build(&mut buckets, String::new(), table);
16+
impl From<api::Table> for Table {
17+
fn from(value: api::Table) -> Self {
18+
let opts = value.opts.resolved();
19+
let mut items = Vec::new();
20+
21+
for (name, item) in value.items {
22+
let item = match item {
23+
api::Item::Table(table) => Item::Table(table.into()),
24+
api::Item::Event(event) => Item::Event(Event {
25+
opts: opts.clone(),
26+
thru: event.thru,
27+
from: event.from,
28+
data: event.data.into_iter().map(|ty| Type::from(ty)).collect(),
29+
}),
30+
};
31+
32+
items.push((name, item))
33+
}
4334

44-
Hir { buckets }
35+
Table { items }
36+
}
4537
}
4638

4739
impl From<api::Type> for Type {

src/hir/display.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
use std::fmt::Display;
2+
3+
use crate::hir::{
4+
ArrayType, BinaryStringType, BooleanType, EnumType, MapType, NumberType, SetType, StructType,
5+
Type, Utf8StringType, VectorType,
6+
};
7+
8+
impl Display for Type {
9+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10+
match self {
11+
Self::Boolean(ty) => write!(f, "{ty}"),
12+
Self::Number(ty) => write!(f, "{ty}"),
13+
Self::Vector(ty) => write!(f, "{ty}"),
14+
Self::BinaryString(ty) => write!(f, "{ty}"),
15+
Self::Utf8String(ty) => write!(f, "{ty}"),
16+
Self::Array(ty) => write!(f, "{ty}"),
17+
Self::Set(ty) => write!(f, "{ty}"),
18+
Self::Map(ty) => write!(f, "{ty}"),
19+
Self::Enum(ty) => write!(f, "{ty}"),
20+
Self::Struct(ty) => write!(f, "{ty}"),
21+
}
22+
}
23+
}
24+
25+
impl Display for BooleanType {
26+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27+
write!(f, "boolean")
28+
}
29+
}
30+
31+
impl Display for NumberType {
32+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33+
write!(f, "number")
34+
}
35+
}
36+
37+
impl Display for VectorType {
38+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39+
write!(f, "vector")
40+
}
41+
}
42+
43+
impl Display for BinaryStringType {
44+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45+
write!(f, "string")
46+
}
47+
}
48+
49+
impl Display for Utf8StringType {
50+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51+
write!(f, "string")
52+
}
53+
}
54+
55+
impl Display for ArrayType {
56+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57+
write!(f, "{{ {} }}", self.item)
58+
}
59+
}
60+
61+
impl Display for SetType {
62+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
63+
write!(f, "{{ [{}]: boolean }}", self.item)
64+
}
65+
}
66+
67+
impl Display for MapType {
68+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69+
write!(f, "{{ [{}]: {} }}", self.index, self.value)
70+
}
71+
}
72+
73+
impl Display for EnumType {
74+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
75+
write!(f, "(")?;
76+
for variant in &self.variants {
77+
write!(f, "| {variant}")?;
78+
}
79+
write!(f, ")")
80+
}
81+
}
82+
83+
impl Display for StructType {
84+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
85+
write!(f, "{{")?;
86+
for (name, ty) in &self.fields {
87+
write!(f, "[\"{name}\"]: {ty},")?;
88+
}
89+
write!(f, "}}")
90+
}
91+
}

src/hir/mod.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
1-
use std::collections::HashMap;
2-
31
use crate::{
42
options::Options,
53
shared::{NetworkSide, NumberKind, Range, Remote},
64
};
75

6+
mod buckets;
87
mod build;
8+
mod display;
99
mod size;
1010

11+
pub use buckets::Buckets;
1112
pub use build::build;
1213

1314
pub struct Hir {
14-
pub buckets: HashMap<Remote, Vec<Item>>,
15+
pub table: Table,
16+
}
17+
18+
#[derive(Clone)]
19+
pub struct Table {
20+
pub items: Vec<(String, Item)>,
1521
}
1622

1723
#[derive(Clone)]
1824
pub enum Item {
25+
Table(Table),
1926
Event(Event),
2027
}
2128

2229
#[derive(Clone)]
2330
pub struct Event {
2431
pub opts: Options,
25-
pub path: String,
32+
pub thru: Remote,
2633
pub from: NetworkSide,
2734
pub data: Vec<Type>,
2835
}
@@ -125,16 +132,6 @@ impl Length {
125132
NumberKind::U32
126133
}
127134
}
128-
129-
pub fn number_type(&self) -> NumberType {
130-
NumberType {
131-
kind: self.kind(),
132-
range: Range {
133-
min: Some(self.min as f64),
134-
max: self.max.map(|max| max as f64),
135-
},
136-
}
137-
}
138135
}
139136

140137
impl From<Length> for Range {

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ fn main() {
4141

4242
let items = hir::build(table);
4343

44-
let server = mir::server(&items.buckets);
45-
let client = mir::client(&items.buckets);
44+
let server = mir::server(&items);
45+
let client = mir::client(&items);
4646

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

src/mir/client/iter.rs

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ use crate::{
88
},
99
};
1010

11-
pub fn iter(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
11+
pub fn iter(b: &mut Builder, recvctx: &RecvCtx, path: &str, event: &Event) {
1212
match event.data.len() {
13-
0 => self::iter_0data(b, recvctx, event),
14-
1 => self::iter_1data(b, recvctx, event),
15-
_ => self::iter_ndata(b, recvctx, event),
13+
0 => self::iter_0data(b, recvctx, path, event),
14+
1 => self::iter_1data(b, recvctx, path, event),
15+
_ => self::iter_ndata(b, recvctx, path, event),
1616
}
1717
}
1818

19-
fn iter_0data(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
19+
fn iter_0data(b: &mut Builder, recvctx: &RecvCtx, path: &str, event: &Event) {
2020
let counter = b.init(0);
2121

2222
let listener = b.function(|b, []| {
@@ -41,7 +41,7 @@ fn iter_0data(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
4141
b.ret(vec![next.expr(), captured.expr(), 0.into()]);
4242
});
4343

44-
b.export(&event.path, event.opts.casing.fmt("iter"), &iter)
44+
b.export(path, event.opts.casing.fmt("iter"), &iter)
4545
}
4646

4747
fn queue(b: &mut Builder, recvctx: &RecvCtx, event: &Event) -> TVar {
@@ -72,7 +72,7 @@ fn queue(b: &mut Builder, recvctx: &RecvCtx, event: &Event) -> TVar {
7272
queue
7373
}
7474

75-
fn iter_1data(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
75+
fn iter_1data(b: &mut Builder, recvctx: &RecvCtx, path: &str, event: &Event) {
7676
let queue = self::queue(b, recvctx, event);
7777

7878
let iter = b.function(|b, []| {
@@ -81,10 +81,10 @@ fn iter_1data(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
8181
b.ret(vec![captured.expr()]);
8282
});
8383

84-
b.export(&event.path, event.opts.casing.fmt("iter"), &iter)
84+
b.export(path, event.opts.casing.fmt("iter"), &iter)
8585
}
8686

87-
fn iter_ndata(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
87+
fn iter_ndata(b: &mut Builder, recvctx: &RecvCtx, path: &str, event: &Event) {
8888
let queue = self::queue(b, recvctx, event);
8989

9090
let next = b.function(|b, [captured, i]| {
@@ -109,5 +109,27 @@ fn iter_ndata(b: &mut Builder, recvctx: &RecvCtx, event: &Event) {
109109
b.ret(vec![next.expr(), captured.expr(), 1.into()]);
110110
});
111111

112-
b.export(&event.path, event.opts.casing.fmt("iter"), &iter)
112+
b.export(path, event.opts.casing.fmt("iter"), &iter)
113+
}
114+
115+
pub fn interface(s: &mut String, event: &Event) -> std::fmt::Result {
116+
use std::fmt::Write;
117+
118+
match event.data.len() {
119+
0 => write!(s, "{{ iter: () -> (number?) -> number? }}"),
120+
1 => write!(s, "{{ iter: () -> {{ {} }} }}", event.data.first().unwrap()),
121+
_ => {
122+
let args = event
123+
.data
124+
.iter()
125+
.map(|ty| ty.to_string())
126+
.collect::<Vec<_>>()
127+
.join(", ");
128+
129+
write!(
130+
s,
131+
"{{ iter: () -> ((, {{ any }} number?) -> (number?, {args}), {{ any }}) }}"
132+
)
133+
}
134+
}
113135
}

0 commit comments

Comments
 (0)