Skip to content

Commit b957bae

Browse files
committed
Merge branch 'master' into holykol/sails-builder
2 parents a54ceb4 + 6cfea1b commit b957bae

32 files changed

+529
-273
lines changed

Cargo.lock

+156-116
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ members = [
2929
anyhow = "1"
3030
convert-case = { package = "convert_case", version = "0.6" }
3131
futures = { version = "0.3", default-features = false }
32-
gear-core-errors = "1.1.1"
32+
gear-core-errors = "1.3.0"
3333
git-download = "0.1"
34-
gstd = "1.1.1"
35-
gtest = "1.1.1"
36-
gwasm-builder = { package = "gear-wasm-builder", version = "1.1.1" }
34+
gstd = "1.3.0"
35+
gtest = "1.3.0"
36+
gwasm-builder = { package = "gear-wasm-builder", version = "1.3.0" }
3737
handlebars = "4.4"
3838
hashbrown = "0.14"
3939
hex = { version = "0.4", default-features = false }

client-gen/src/generator.rs

+1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ impl CtorTraitGenerator {
145145

146146
impl<'ast> Visitor<'ast> for CtorTraitGenerator {
147147
fn visit_ctor(&mut self, ctor: &'ast Ctor) {
148+
self.code.push_str("#[allow(dead_code)]\n");
148149
self.code.push_str(&format!(
149150
"pub trait {}Factory<A: Default> {{\n",
150151
self.service_name

client-gen/src/snapshots/sails_clientgen__generator__tests__rmrk_works.snap

+1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ pub struct SlotPart {
260260
}
261261
pub mod traits {
262262
use super::*;
263+
#[allow(dead_code)]
263264
pub trait RmrkCatalogFactory<A: Default> {
264265
#[allow(clippy::new_ret_no_self)]
265266
fn new(remoting: impl Remoting<A>) -> impl Activation<A>;

client-gen/src/snapshots/sails_clientgen__tests__full.snap

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ pub enum T {
150150
}
151151
pub mod traits {
152152
use super::*;
153+
#[allow(dead_code)]
153154
pub trait ServiceFactory<A: Default> {
154155
#[allow(clippy::new_ret_no_self)]
155156
fn new(remoting: impl Remoting<A>, a: u32) -> impl Activation<A>;

examples/rmrk/resource/wasm/tests/resources.rs

+54-15
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ fn adding_resource_to_storage_by_admin_succeeds() {
6464
assert!(run_result.contains(&(ADMIN_ID, expected_response)));
6565

6666
let expected_event = [
67+
resources::RESOURCE_SERVICE_NAME.encode().as_slice(),
6768
"ResourceAdded".encode().as_slice(),
6869
&ResourceStorageEvent::ResourceAdded {
6970
resource_id: RESOURCE_ID,
@@ -196,53 +197,91 @@ fn adding_non_existing_part_to_resource_fails() {
196197

197198
struct Fixture<'a> {
198199
admin_id: u64,
199-
net_client: GTestRemoting,
200+
program_space: GTestRemoting,
200201
catalog_program: OnceCell<Program<'a>>,
201202
resource_program: OnceCell<Program<'a>>,
202203
}
203204

204205
impl<'a> Fixture<'a> {
205206
fn new(admin_id: u64) -> Self {
206-
let net_client = GTestRemoting::new();
207-
net_client.system().init_logger();
207+
let program_space = GTestRemoting::new();
208+
program_space.system().init_logger();
208209

209210
Self {
210211
admin_id,
211-
net_client,
212+
program_space,
212213
catalog_program: OnceCell::new(),
213214
resource_program: OnceCell::new(),
214215
}
215216
}
216217

217-
fn net_client(&self) -> &GTestRemoting {
218-
&self.net_client
218+
fn program_space(&self) -> &GTestRemoting {
219+
&self.program_space
219220
}
220221

221222
fn catalog_program(&'a self) -> &Program<'a> {
222223
self.catalog_program.get_or_init(|| {
223-
let program = Program::from_file(self.net_client.system(), CATALOG_PROGRAM_WASM_PATH);
224+
let program =
225+
Program::from_file(self.program_space.system(), CATALOG_PROGRAM_WASM_PATH);
224226
let encoded_request = catalog::CTOR_FUNC_NAME.encode();
225227
program.send_bytes(self.admin_id, encoded_request);
226228
program
227229
})
228230
}
229231

230-
fn resource_program(&'a self) -> &Program<'a> {
232+
fn resource_program_for_async(&'a self) -> &Program<'a> {
233+
println!("For async");
231234
self.resource_program.get_or_init(|| {
232-
let program = Program::from_file(self.net_client.system(), RESOURCE_PROGRAM_WASM_PATH);
235+
let program =
236+
Program::from_file(self.program_space.system(), RESOURCE_PROGRAM_WASM_PATH);
233237
let encoded_request = resources::CTOR_FUNC_NAME.encode();
234238
program.send_bytes(self.admin_id, encoded_request);
235239
program
236240
})
237241
}
238242

243+
fn resource_program_for_sync(&'a self) -> &Program<'a> {
244+
println!("For sync");
245+
self.resource_program.get_or_init(|| {
246+
tokio::runtime::Builder::new_current_thread()
247+
.enable_all()
248+
.build()
249+
.unwrap()
250+
.block_on(async {
251+
self.__spin_up_program(
252+
RESOURCE_PROGRAM_WASM_PATH,
253+
&resources::CTOR_FUNC_NAME.encode(),
254+
)
255+
.await
256+
})
257+
})
258+
}
259+
260+
async fn __spin_up_program(&'a self, program_path: &str, payload: &[u8]) -> Program<'a> {
261+
let code_id = self.program_space().system().submit_code(program_path);
262+
let program_space = self.program_space().clone();
263+
let reply = program_space
264+
.activate(
265+
code_id.as_ref().into(),
266+
"123",
267+
payload,
268+
0,
269+
GTestArgs::new(self.admin_id.into()),
270+
)
271+
.await
272+
.unwrap();
273+
self.program_space()
274+
.system()
275+
.get_program(*reply.await.unwrap().0.as_ref())
276+
}
277+
239278
fn add_resource(
240279
&'a self,
241280
actor_id: u64,
242281
resource_id: ResourceId,
243282
resource: &Resource,
244283
) -> RunResult {
245-
let program = self.resource_program();
284+
let program = self.resource_program_for_sync();
246285
let encoded_request = [
247286
resources::RESOURCE_SERVICE_NAME.encode(),
248287
resources::ADD_RESOURCE_ENTRY_FUNC_NAME.encode(),
@@ -266,10 +305,10 @@ impl<'a> Fixture<'a> {
266305
resource.encode(),
267306
]
268307
.concat();
269-
let net_client = self.net_client().clone();
270-
let reply = net_client
308+
let program_space = self.program_space().clone();
309+
let reply = program_space
271310
.message(
272-
self.resource_program().id().as_ref().into(),
311+
self.resource_program_for_async().id().as_ref().into(),
273312
encoded_request,
274313
0,
275314
GTestArgs::new(actor_id.into()),
@@ -284,7 +323,7 @@ impl<'a> Fixture<'a> {
284323
resource_id: ResourceId,
285324
part_id: PartId,
286325
) -> RunResult {
287-
let program = self.resource_program();
326+
let program = self.resource_program_for_sync();
288327
let encoded_request = [
289328
resources::RESOURCE_SERVICE_NAME.encode(),
290329
resources::ADD_PART_TO_RESOURCE_FUNC_NAME.encode(),
@@ -300,7 +339,7 @@ impl<'a> Fixture<'a> {
300339
actor_id: u64,
301340
resource_id: ResourceId,
302341
) -> Option<ResourceStorageResult<Resource>> {
303-
let program = self.resource_program();
342+
let program = self.resource_program_for_sync();
304343
let encoded_service_name = resources::RESOURCE_SERVICE_NAME.encode();
305344
let encoded_func_name = resources::RESOURCE_FUNC_NAME.encode();
306345
let encoded_request = [

examples/this-that-svc/app/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use gstd::{debug, prelude::*};
44
use primitive_types::{H256, U256};
55
use sails_macros::gservice;
66

7+
#[derive(Default)]
78
pub struct MyService;
89

910
#[gservice]

js/README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,20 @@ The key of the object is the name of the event and the value is an object with t
8383
```
8484

8585
### Get function name and decode bytes
86-
Use `sails.getServiceName` method to get the service name from the payload bytes.
87-
Use `sails.getFnName` method to get the function name from the payload bytes.
86+
Use `getServiceNamePrefix` function to get the service name from the payload bytes.
87+
Use `getFnNamePrefix` method to get the function or event name from the payload bytes.
8888
Use `sails.services.ServiceName.functions.FuncitonName.decodePayload` method of the function object to decode the payload bytes of the send message.
8989
Use `sails.services.ServiceName.functions.FuncitonName.decodeResult` method of the function object to decode the result bytes of the received message.
9090

9191
```javascript
92+
import { getServiceNamePrefix, getFnNamePrefix } from 'sails-js';
9293
const payloadOfSentMessage = '0x<some bytes>';
93-
const serviceName = sails.getServiceName(payloadOfSentMessage);
94-
const functionName = sails.getFnName(payloadOfSentMessage);
94+
const serviceName = getServiceNamePrefix(payloadOfSentMessage);
95+
const functionName = getFnNamePrefix(payloadOfSentMessage);
9596
console.log(sails.services[serviceName].functions[functionName].decodeResult(payloadOfSentMessage));
9697

9798
const payloadOfReceivedMessage = '0x<some bytes>';
98-
const functionName = sails.getFunctionName(payloadOfReceivedMessage);
99-
console.log(sails.functions[functionName].decodePayload(payloadOfReceivedMessage));
99+
console.log(sails.service[serviceName].functions[functionName].decodePayload(payloadOfReceivedMessage));
100100
```
101101

102102
The same approach can be used to encode/decode bytes of the contructor or event.

js/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sails-js",
3-
"version": "0.1.0",
3+
"version": "0.1.1",
44
"description": "Parser and typescript code generator from Sails IDL files",
55
"main": "lib/index.js",
66
"preferGlobal": true,
@@ -33,8 +33,8 @@
3333
},
3434
"scripts": {
3535
"prebuild": "rm -rf lib",
36-
"build": "rm -rf lib && rollup --config rollup.config.js && node compress-parser.js",
3736
"pretest": "yarn build && node test/modify-import.js",
37+
"build": "rm -rf lib && rollup --config rollup.config.js && node compress-parser.js",
3838
"test": "yarn node --no-warnings --experimental-vm-modules $(yarn bin jest) --detectOpenHandles"
3939
},
4040
"peerDependencies": {
@@ -43,7 +43,7 @@
4343
"@polkadot/types": "^10.12.3"
4444
},
4545
"devDependencies": {
46-
"@gear-js/api": "0.37.2",
46+
"@gear-js/api": "0.38.0",
4747
"@polkadot/api": "10.12.6",
4848
"@polkadot/types": "10.12.6",
4949
"@rollup/plugin-commonjs": "25.0.7",

js/src/generate/service-gen.ts

+15-15
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ const getFuncName = (name: string) => {
1919

2020
const createPayload = (serviceName: string, fnName: string, params: FuncParam[]) => {
2121
if (params.length === 0) {
22-
return `const payload = this._program.registry.createType('(String, String)', '[${serviceName}, ${fnName}]').toU8a()`;
22+
return `const payload = this._program.registry.createType('(String, String)', '[${serviceName}, ${fnName}]').toHex()`;
2323
} else {
2424
return `const payload = this._program.registry.createType('(String, String, ${params
2525
.map(({ def }) => getScaleCodecDef(def))
26-
.join(', ')})', ['${serviceName}', '${fnName}', ${params.map(({ name }) => name).join(', ')}]).toU8a()`;
26+
.join(', ')})', ['${serviceName}', '${fnName}', ${params.map(({ name }) => name).join(', ')}]).toHex()`;
2727
}
2828
};
2929

@@ -220,7 +220,8 @@ export class ServiceGenerator {
220220
this._out
221221
.firstLine(`const ZERO_ADDRESS = u8aToHex(new Uint8Array(32))`)
222222
.import('@polkadot/util', 'u8aToHex')
223-
.import('@polkadot/util', 'compactFromU8aLim');
223+
.import('sails-js', 'getServiceNamePrefix')
224+
.import('sails-js', 'getFnNamePrefix');
224225
}
225226

226227
for (const event of service.events) {
@@ -243,19 +244,18 @@ export class ServiceGenerator {
243244
},
244245
)
245246
.line()
246-
.line(`const payload = message.payload.toU8a()`)
247-
.line(`const [offset, limit] = compactFromU8aLim(payload)`)
248-
.line(
249-
`const name = this._program.registry.createType('String', payload.subarray(offset, limit)).toString()`,
247+
.line(`const payload = message.payload.toHex()`)
248+
.block(
249+
`if (getServiceNamePrefix(payload) === '${service.name}' && getFnNamePrefix(payload) === '${event.name}')`,
250+
() => {
251+
this._out.line(
252+
`callback(this._program.registry.createType('(String, String, ${getScaleCodecDef(
253+
event.def,
254+
true,
255+
)})', message.payload)[2].toJSON() as ${jsType})`,
256+
);
257+
},
250258
)
251-
.block(`if (name === '${event.name}')`, () => {
252-
this._out.line(
253-
`callback(this._program.registry.createType('(String, ${getScaleCodecDef(
254-
event.def,
255-
true,
256-
)})', message.payload)[1].toJSON() as ${jsType})`,
257-
);
258-
})
259259
.reduceIndent()
260260
.line(`})`);
261261
},

js/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { Sails } from './sails.js';
22
export { TransactionBuilder } from './transaction-builder.js';
3+
export { getServiceNamePrefix, getFnNamePrefix } from './utils/index.js';

js/src/parser/visitor.ts

+10
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@ export enum EPrimitiveType {
257257
ActorId,
258258
CodeId,
259259
MessageId,
260+
H256,
261+
U256,
260262
}
261263

262264
export class PrimitiveDef {
@@ -329,6 +331,14 @@ export class PrimitiveDef {
329331
get isMessageId(): boolean {
330332
return this.value === EPrimitiveType.MessageId;
331333
}
334+
335+
get isH256(): boolean {
336+
return this.value === EPrimitiveType.H256;
337+
}
338+
339+
get isU256(): boolean {
340+
return this.value === EPrimitiveType.U256;
341+
}
332342
}
333343

334344
export class OptionalDef extends WithDef {}

0 commit comments

Comments
 (0)