Skip to content

Commit af12bf3

Browse files
committed
added flag to denote whether a name is being used in a partial manner
1 parent ee4ba53 commit af12bf3

9 files changed

Lines changed: 396 additions & 152 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
docs
44
coverage
55
/testdata/*/actual/*
6+
/testdata/rust/target/*
67
bundle.js
78

89
!/testdata/*/actual/go.*
910
!/testdata/*/actual/package.*
10-
!/testdata/*/actual/requirements.txt
11+
!/testdata/*/actual/requirements.txt

src/rust/utils/mod.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ export function trimLines(lines: string[]): string {
1616
return finalLines.join("\n");
1717
}
1818

19-
export function rustify(name: string): string {
19+
export function rustify(name: string, partial = false): string {
2020
const base = snakeCase(name);
21-
22-
return isReservedWord(base) ? `r#${base}` : base;
21+
return isReservedWord(base) && !partial ? `r#${base}` : base;
2322
}
2423

2524
export function rustifyCaps(name: string): string {

src/rust/visitors/union_visitor.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
Context,
55
Kind,
66
ObjectMap,
7+
Primitive,
78
Union,
89
} from "../../deps/core/model.ts";
910
import { codegenType, isNamed, isRecursiveType } from "../../utils/mod.ts";
@@ -23,11 +24,17 @@ function getTypeName(t: AnyType): string {
2324
if (isNamed(t)) {
2425
return t.name;
2526
} else {
26-
const apexType = codegenType(t);
27-
throw new Error(
28-
`Can't represent an Apex union with primitive or non-named types as a Rust enum.` +
29-
` Try turning "${apexType}" into an alias, e.g. "alias MyType = ${apexType}".`,
30-
);
27+
switch (t.kind) {
28+
case Kind.Primitive:
29+
return (t as Primitive).name;
30+
default: {
31+
const apexType = codegenType(t);
32+
throw new Error(
33+
`Can't represent an Apex union with non-named types as a Rust enum.` +
34+
` Try turning "${apexType}" into an alias, e.g. "alias MyType = ${apexType}".`,
35+
);
36+
}
37+
}
3138
}
3239
}
3340

testdata/rust/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

testdata/rust/Cargo.toml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[package]
2+
name = "testdata"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
[[bin]]
8+
name = "main"
9+
path = "actual/main.rs"
10+
11+
[dependencies]

testdata/rust/apex.axdl

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
import * from "@apexlang/core"
2+
3+
namespace "iota.testing"
4+
5+
# UUID is an alias that is mapped to a custom data type
6+
alias UUID = string
7+
alias MyAlias = string
8+
9+
func someCalc(rhs: i64, lhs: i64): i64
10+
11+
interface MyStreamer @service {
12+
requestStreamI64(): stream i64
13+
requestStreamF64(): stream f64
14+
requestStreamType(): stream MyType
15+
requestStreamEnum(): stream MyEnum
16+
requestStreamUUID(): stream UUID
17+
requestStreamAlias(): stream MyAlias
18+
requestStreamString(): stream string
19+
requestStreamBool(): stream bool
20+
requestStreamDatetime(): stream datetime
21+
requestStreamList(): stream [string]
22+
requestStreamMap(): stream { string : string }
23+
requestStreamArgsI64(value: i64): stream i64
24+
requestStreamArgsF64(value: f64): stream f64
25+
requestStreamArgsType(value: MyType): stream MyType
26+
requestStreamArgsEnum(value: MyEnum): stream MyEnum
27+
requestStreamArgsUUID(value: UUID): stream UUID
28+
requestStreamArgsAlias(value: MyAlias): stream MyAlias
29+
requestStreamArgsString(value: string): stream string
30+
requestStreamArgsBool(value: bool): stream bool
31+
requestStreamArgsDatetime(value: datetime): stream datetime
32+
requestStreamArgsList(value: [string]): stream [string]
33+
requestStreamArgsMap(value: { string : string }): stream { string : string }
34+
35+
requestChannelI64(in: stream i64): stream i64
36+
requestChannelF64(in: stream f64): stream f64
37+
requestChannelType(in: stream MyType): stream MyType
38+
requestChannelEnum(in: stream MyEnum): stream MyEnum
39+
requestChannelAlias(in: stream UUID): stream UUID
40+
requestChannelString(in: stream string): stream string
41+
requestChannelBool(in: stream bool): stream bool
42+
requestChannelDatetime(in: stream datetime): stream datetime
43+
requestChannelList(in: stream [string]): stream [string]
44+
requestChannelMap(in: stream { string : string }): stream { string : string }
45+
requestChannelArgsI64(value: i64, in: stream i64): stream i64
46+
requestChannelArgsF64(value: f64, in: stream f64): stream f64
47+
requestChannelArgsType(value: MyType, in: stream MyType): stream MyType
48+
requestChannelArgsEnum(value: MyEnum, in: stream MyEnum): stream MyEnum
49+
requestChannelArgsAlias(value: UUID, in: stream UUID): stream UUID
50+
requestChannelArgsString(value: string, in: stream string): stream string
51+
requestChannelArgsBool(value: bool, in: stream bool): stream bool
52+
requestChannelArgsDatetime(value: datetime, in: stream datetime): stream datetime
53+
requestChannelArgsList(value: [string], in: stream [string]): stream [string]
54+
requestChannelArgsMap(value: { string : string }, in: stream { string : string }): stream { string : string }
55+
}
56+
57+
interface MyService @service @uses(["Repository"]) {
58+
emptyVoid(): void
59+
unaryType[value: MyType]: MyType
60+
unaryEnum[value : MyEnum]: MyEnum
61+
unaryUUID[value : UUID]: UUID
62+
unaryAlias[value : MyAlias]: MyAlias
63+
unaryString[value : string]: string
64+
unaryI64[value : i64]: i64
65+
unaryI32[value : i32]: i32
66+
unaryI16[value : i16]: i16
67+
unaryI8[value : i8]: i8
68+
unaryU64[value : u64]: u64
69+
unaryU32[value : u32]: u32
70+
unaryU16[value : u16]: u16
71+
unaryU8[value : u8]: u8
72+
unaryF64[value : f64]: f64
73+
unaryF32[value : f32]: f32
74+
unaryBytes[value : bytes]: bytes
75+
unaryDatetime[value : datetime]: datetime
76+
unaryList[value: [string]]: [string]
77+
unaryMap[value: { string : string }]: { string : string }
78+
79+
funcType(value: MyType, optional: MyType?): MyType
80+
funcEnum(value: MyEnum, optional: MyEnum?): MyEnum
81+
funcUUID(value: UUID, optional: UUID?): UUID
82+
funcAlias(value: MyAlias, optional: MyAlias?): MyAlias
83+
funcString(value: string, optional: string?): string
84+
funcI64(value: i64, optional: i64?): i64
85+
funcI32(value: i32, optional: i32?): i32
86+
funcI16(value: i16, optional: i16?): i16
87+
funcI8(value: i8, optional: i8?): i8
88+
funcU64(value: u64, optional: u64?): u64
89+
funcU32(value: u32, optional: u32?): u32
90+
funcU16(value: u16, optional: u16?): u16
91+
funcU8(value: u8, optional: u8?): u8
92+
funcF64(value: f64, optional: f64?): f64
93+
funcF32(value: f32, optional: f32?): f32
94+
funcBytes(value: bytes, optional: bytes?): bytes
95+
funcDatetime(value: datetime, optional: datetime?): datetime
96+
funcList(value: [string], optional: [string]?): [string]
97+
funcMap(value: { string : string }, optional: { string : string }?): { string : string }
98+
}
99+
100+
interface Repository @dependency {
101+
getData(): MyType
102+
}
103+
104+
union MyUnion = MyType | MyEnum | string
105+
106+
"MyType is a class"
107+
type MyType {
108+
"same type value"
109+
sameValue: MyType?
110+
"type value"
111+
typeValue: MyOtherType
112+
"string value"
113+
stringValue: string
114+
"string option"
115+
stringOption: string?
116+
"i64 value"
117+
i64Value: i64
118+
"i64 option"
119+
i64Option: i64?
120+
"i32 value"
121+
i32Value: i32
122+
"i32 option"
123+
i32Option: i32?
124+
"i16 value"
125+
i16Value: i16
126+
"i16 option"
127+
i16Option: i16? @n(10)
128+
"i8 value"
129+
i8Value: i8 @n(11)
130+
"i8 option"
131+
i8Option: i8? @n(12)
132+
"u64 value"
133+
u64Value: u64 @n(13)
134+
"u64 option"
135+
u64Option: u64? @n(14)
136+
"u32 value"
137+
u32Value: u32 @n(15)
138+
"u32 option"
139+
u32Option: u32? @n(16)
140+
"u16 value"
141+
u16Value: u16 @n(17)
142+
"u16 option"
143+
u16Option: u16? @n(18)
144+
"u8 value"
145+
u8Value: u8 @n(19)
146+
"u8 option"
147+
u8Option: u8? @n(20)
148+
"f64 value"
149+
f64Value: f64 @n(21)
150+
"f64 option"
151+
f64Option: f64? @n(22)
152+
"f32 value"
153+
f32Value: f32 @n(23)
154+
"f32 option"
155+
f32Option: f32? @n(24)
156+
"datetime value"
157+
datetimeValue: datetime @n(25)
158+
"datetime option"
159+
datetimeOption: datetime? @n(26)
160+
"bytes value"
161+
bytesValue: bytes @n(27)
162+
"bytes option"
163+
bytesOption: bytes? @n(28)
164+
"map value"
165+
mapValue: { string: i64 } @n(29)
166+
"map of types"
167+
mapOfTypes: { string: MyType } @n(30)
168+
"array value"
169+
arrayValue: [string] @n(31)
170+
"array of types"
171+
arrayOfTypes: [MyType] @n(32)
172+
"union value"
173+
unionValue: MyUnion @n(33)
174+
"union option"
175+
unionOption: MyUnion? @n(34)
176+
"enum value"
177+
enumValue: MyEnum @n(35)
178+
"enum option"
179+
enumOption: MyEnum? @n(36)
180+
"enum value"
181+
aliasValue: UUID @n(37)
182+
"enum option"
183+
aliasOption: UUID? @n(38)
184+
# "any value"
185+
# anyValue: any @n(999)
186+
}
187+
188+
type MyOtherType {
189+
foo: string
190+
bar: string
191+
}
192+
193+
"MyEnum is an emuneration"
194+
enum MyEnum {
195+
"ONE value"
196+
ONE = 0 as "one"
197+
"TWO value"
198+
TWO = 1
199+
"THREE value"
200+
THREE = 2 as "three"
201+
}

testdata/rust/apex.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
spec: ../spec.apexlang
1+
spec: ../apex.axdl
22
generates:
33
basics.rs:
44
module: '../../../src/rust/mod.ts'

0 commit comments

Comments
 (0)