Skip to content

Commit b80a6d4

Browse files
authored
Serialize and deserialize support for Map type. (#41)
1 parent 1eed6ae commit b80a6d4

3 files changed

Lines changed: 57 additions & 0 deletions

File tree

borsh-ts/index.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,14 @@ function serializeField(
291291
}
292292
break;
293293
}
294+
case "map": {
295+
writer.writeU32(value.size);
296+
value.forEach((val, key) => {
297+
serializeField(schema, fieldName, key, fieldType.key, writer);
298+
serializeField(schema, fieldName, val, fieldType.value, writer);
299+
});
300+
break;
301+
}
294302
default:
295303
throw new BorshError(`FieldType ${fieldType} unrecognized`);
296304
}
@@ -384,6 +392,16 @@ function deserializeField(
384392

385393
return undefined;
386394
}
395+
if (fieldType.kind === "map") {
396+
let map = new Map();
397+
const length = reader.readU32();
398+
for (let i = 0; i < length; i++) {
399+
const key = deserializeField(schema, fieldName, fieldType.key, reader);
400+
const val = deserializeField(schema, fieldName, fieldType.value, reader);
401+
map.set(key, val);
402+
}
403+
return map
404+
}
387405

388406
return deserializeStruct(schema, fieldType, reader);
389407
} catch (error) {

borsh-ts/test/serialize.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,24 @@ test('serialize with custom writer/reader', async () => {
181181
const newValue = borsh.deserialize(schema, Test, buf, ExtendedReader);
182182
expect(newValue.x).toEqual(new Date(time));
183183
});
184+
185+
test('serialize map', async () => {
186+
let map = new Map();
187+
for (let i = 0; i < 10; i++) {
188+
map.set(new BN(i * 10), "some string " + i.toString());
189+
}
190+
const value = new Test({ x: map });
191+
const schema = new Map([[ Test, {
192+
kind: 'struct',
193+
fields: [
194+
['x', { kind: 'map', key: 'u64', value: 'string' }],
195+
],
196+
}]]);
197+
198+
const buf = borsh.serialize(schema, value);
199+
const deserialized = borsh.deserialize(schema, Test, buf);
200+
expect(deserialized.x.size).toEqual(10);
201+
deserialized.x.forEach((value, key) => {
202+
expect(value).toEqual("some string " + (key.toNumber() / 10).toString());
203+
});
204+
});

lib/index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ function serializeField(schema, fieldName, value, fieldType, writer) {
292292
}
293293
break;
294294
}
295+
case "map": {
296+
writer.writeU32(value.size);
297+
value.forEach((val, key) => {
298+
serializeField(schema, fieldName, key, fieldType.key, writer);
299+
serializeField(schema, fieldName, val, fieldType.value, writer);
300+
});
301+
break;
302+
}
295303
default:
296304
throw new BorshError(`FieldType ${fieldType} unrecognized`);
297305
}
@@ -371,6 +379,16 @@ function deserializeField(schema, fieldName, fieldType, reader) {
371379
}
372380
return undefined;
373381
}
382+
if (fieldType.kind === "map") {
383+
let map = new Map();
384+
const length = reader.readU32();
385+
for (let i = 0; i < length; i++) {
386+
const key = deserializeField(schema, fieldName, fieldType.key, reader);
387+
const val = deserializeField(schema, fieldName, fieldType.value, reader);
388+
map.set(key, val);
389+
}
390+
return map;
391+
}
374392
return deserializeStruct(schema, fieldType, reader);
375393
}
376394
catch (error) {

0 commit comments

Comments
 (0)