Skip to content

Commit b37b25d

Browse files
feat: support for tuple types
closes [feature request] Tuples #43
1 parent 0b6b6f6 commit b37b25d

File tree

5 files changed

+54
-14
lines changed

5 files changed

+54
-14
lines changed

src/typescript.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,26 @@ pub fn convert_type(ty: &syn::Type) -> TsType {
176176
"unknown".to_owned().into()
177177
}
178178
}
179+
syn::Type::Tuple(t) => {
180+
let types = t
181+
.elems
182+
.iter()
183+
.map(|elem| convert_type(elem))
184+
.map(|ty| {
185+
if ty.is_optional {
186+
format!("{} | undefined", ty.ts_type)
187+
} else {
188+
ty.ts_type
189+
}
190+
})
191+
.collect::<Vec<String>>()
192+
.join(", ");
193+
194+
TsType {
195+
ts_type: format!("[{}]", types),
196+
is_optional: false,
197+
}
198+
}
179199
_ => "unknown".to_owned().into(),
180200
}
181201
}

test/issue-43/rust.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
// #[tsync]
2-
// struct HasTuple1 {
3-
// foo: i32,
4-
// bar: Option<(String, i32)>,
5-
// }
6-
7-
// #[tsync]
8-
// struct HasTuple2 {
9-
// foo: i32,
10-
// bar: (String, i32),
11-
// }
1+
#[tsync]
2+
struct HasTuple {
3+
foo: i32,
4+
bar: Option<(String, i32)>,
5+
baz: (String, i32),
6+
zip: (i32, String, (String, (i32, i32))),
7+
qux: (Option<String>, (i32, String)),
8+
ping: (i32, String, Option<(String, (i32, i32))>),
9+
pong: Option<(i32, String, Option<(String, Option<(i32, i32)>)>)>,
10+
}
1211

1312
#[tsync]
1413
struct IsTuple(i32, String);

test/issue-43/typescript.d.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
/* This file is generated and managed by tsync */
22

3+
interface HasTuple {
4+
foo: number;
5+
bar?: [string, number];
6+
baz: [string, number];
7+
zip: [number, string, [string, [number, number]]];
8+
qux: [string | undefined, [number, string]];
9+
ping: [number, string, [string, [number, number]] | undefined];
10+
pong?: [number, string, [string, [number, number] | undefined] | undefined];
11+
}
12+
313
type IsTuple = [ number, string ]
414

5-
type IsTupleComplex = [ number, string, unknown ]
15+
type IsTupleComplex = [ number, string, [string, [number, number]] ]

test/issue-43/typescript.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
/* This file is generated and managed by tsync */
22

3+
export interface HasTuple {
4+
foo: number;
5+
bar?: [string, number];
6+
baz: [string, number];
7+
zip: [number, string, [string, [number, number]]];
8+
qux: [string | undefined, [number, string]];
9+
ping: [number, string, [string, [number, number]] | undefined];
10+
pong?: [number, string, [string, [number, number] | undefined] | undefined];
11+
}
12+
313
export type IsTuple = [ number, string ]
414

5-
export type IsTupleComplex = [ number, string, unknown ]
15+
export type IsTupleComplex = [ number, string, [string, [number, number]] ]

test/test_all.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ cd $SCRIPT_DIR
88
./struct/tsync.sh
99
./type/tsync.sh
1010
./const/tsync.sh
11-
./const_enum/tsync.sh
11+
./const_enum_numeric/tsync.sh
1212
./enum/tsync.sh
1313
./enum_numeric/tsync.sh
1414
./doc_comments/tsync.sh
1515
./generic/tsync.sh
16+
./issue-43/tsync.sh

0 commit comments

Comments
 (0)