Skip to content

Commit 53fd71b

Browse files
authored
Mini-extracted test for Range values (#4441)
1 parent 63e38b3 commit 53fd71b

File tree

4 files changed

+114
-65
lines changed

4 files changed

+114
-65
lines changed

packages/types-codec/src/extended/Range.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ export class Range<T extends INumber> extends Tuple {
1616
#rangeName: RangeType;
1717

1818
constructor (registry: CodecRegistry, Type: CodecClass<T> | string, value?: AnyTuple, rangeName: RangeType = 'Range') {
19-
super(registry, { end: Type, start: Type }, value);
19+
super(registry, {
20+
end: Type,
21+
start: Type
22+
}, value);
2023

2124
this.#rangeName = rangeName;
2225
}
@@ -52,14 +55,14 @@ export class Range<T extends INumber> extends Tuple {
5255
}
5356

5457
export class RangeInclusive<T extends INumber = INumber> extends Range<T> {
55-
constructor (registry: CodecRegistry, type: CodecClass<T> | string, value?: AnyTuple) {
56-
super(registry, type, value, 'RangeInclusive');
58+
constructor (registry: CodecRegistry, Type: CodecClass<T> | string, value?: AnyTuple) {
59+
super(registry, Type, value, 'RangeInclusive');
5760
}
5861

59-
public static override with <T extends INumber> (Types: CodecClass<T> | string): CodecClass<RangeInclusive<T>> {
62+
public static override with <T extends INumber> (Type: CodecClass<T> | string): CodecClass<RangeInclusive<T>> {
6063
return class extends RangeInclusive<T> {
6164
constructor (registry: CodecRegistry, value?: AnyTuple) {
62-
super(registry, Types, value);
65+
super(registry, Type, value);
6366
}
6467
};
6568
}

packages/types-create/src/util/encodeTypes.ts

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function paramsNotation <T> (outer: string, inner?: T | T[], transform: (
2020
}`;
2121
}
2222

23-
function encodeWithParams (CodecRegistry: CodecRegistry, typeDef: TypeDef, outer: string): string {
23+
function encodeWithParams (registry: CodecRegistry, typeDef: TypeDef, outer: string): string {
2424
const { info, sub } = typeDef;
2525

2626
switch (info) {
@@ -30,17 +30,18 @@ function encodeWithParams (CodecRegistry: CodecRegistry, typeDef: TypeDef, outer
3030
case TypeDefInfo.HashMap:
3131
case TypeDefInfo.Linkage:
3232
case TypeDefInfo.Option:
33+
case TypeDefInfo.Range:
3334
case TypeDefInfo.Result:
3435
case TypeDefInfo.Vec:
3536
case TypeDefInfo.WrapperKeepOpaque:
3637
case TypeDefInfo.WrapperOpaque:
37-
return paramsNotation(outer, sub, (p) => encodeTypeDef(CodecRegistry, p));
38+
return paramsNotation(outer, sub, (p) => encodeTypeDef(registry, p));
3839
}
3940

4041
throw new Error(`Unable to encode ${stringify(typeDef)} with params`);
4142
}
4243

43-
function encodeSubTypes (CodecRegistry: CodecRegistry, sub: TypeDef[], asEnum?: boolean, extra?: Record<string, unknown>): string {
44+
function encodeSubTypes (registry: CodecRegistry, sub: TypeDef[], asEnum?: boolean, extra?: Record<string, unknown>): string {
4445
const names = sub.map(({ name }) => name);
4546

4647
assert(names.every((n) => !!n), () => `Subtypes does not have consistent names, ${names.join(', ')}`);
@@ -50,7 +51,7 @@ function encodeSubTypes (CodecRegistry: CodecRegistry, sub: TypeDef[], asEnum?:
5051
for (let i = 0; i < sub.length; i++) {
5152
const def = sub[i];
5253

53-
inner[def.name as string] = encodeTypeDef(CodecRegistry, def);
54+
inner[def.name as string] = encodeTypeDef(registry, def);
5455
}
5556

5657
return stringify(
@@ -62,44 +63,44 @@ function encodeSubTypes (CodecRegistry: CodecRegistry, sub: TypeDef[], asEnum?:
6263

6364
// We setup a record here to ensure we have comprehensive coverage (any item not covered will result
6465
// in a compile-time error with the missing index)
65-
const encoders: Record<TypeDefInfo, (CodecRegistry: CodecRegistry, typeDef: TypeDef) => string> = {
66-
[TypeDefInfo.BTreeMap]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
67-
encodeWithParams(CodecRegistry, typeDef, 'BTreeMap'),
68-
[TypeDefInfo.BTreeSet]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
69-
encodeWithParams(CodecRegistry, typeDef, 'BTreeSet'),
70-
[TypeDefInfo.Compact]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
71-
encodeWithParams(CodecRegistry, typeDef, 'Compact'),
72-
[TypeDefInfo.DoNotConstruct]: (CodecRegistry: CodecRegistry, { displayName, lookupIndex, lookupName }: TypeDef) =>
73-
`DoNotConstruct<${lookupName || displayName || (isUndefined(lookupIndex) ? 'Unknown' : CodecRegistry.createLookupType(lookupIndex))}>`,
74-
[TypeDefInfo.Enum]: (CodecRegistry: CodecRegistry, { sub }: TypeDef): string => {
66+
const encoders: Record<TypeDefInfo, (registry: CodecRegistry, typeDef: TypeDef) => string> = {
67+
[TypeDefInfo.BTreeMap]: (registry: CodecRegistry, typeDef: TypeDef) =>
68+
encodeWithParams(registry, typeDef, 'BTreeMap'),
69+
[TypeDefInfo.BTreeSet]: (registry: CodecRegistry, typeDef: TypeDef) =>
70+
encodeWithParams(registry, typeDef, 'BTreeSet'),
71+
[TypeDefInfo.Compact]: (registry: CodecRegistry, typeDef: TypeDef) =>
72+
encodeWithParams(registry, typeDef, 'Compact'),
73+
[TypeDefInfo.DoNotConstruct]: (registry: CodecRegistry, { displayName, lookupIndex, lookupName }: TypeDef) =>
74+
`DoNotConstruct<${lookupName || displayName || (isUndefined(lookupIndex) ? 'Unknown' : registry.createLookupType(lookupIndex))}>`,
75+
[TypeDefInfo.Enum]: (registry: CodecRegistry, { sub }: TypeDef): string => {
7576
assert(sub && Array.isArray(sub), 'Unable to encode Enum type');
7677

7778
// c-like enums have all Null entries
7879
// TODO We need to take the disciminant into account and auto-add empty entries
7980
return sub.every(({ type }) => type === 'Null')
8081
? stringify({ _enum: sub.map(({ name }, index) => `${name || `Empty${index}`}`) })
81-
: encodeSubTypes(CodecRegistry, sub, true);
82+
: encodeSubTypes(registry, sub, true);
8283
},
83-
[TypeDefInfo.HashMap]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
84-
encodeWithParams(CodecRegistry, typeDef, 'HashMap'),
85-
[TypeDefInfo.Int]: (CodecRegistry: CodecRegistry, { length = 32 }: TypeDef) =>
84+
[TypeDefInfo.HashMap]: (registry: CodecRegistry, typeDef: TypeDef) =>
85+
encodeWithParams(registry, typeDef, 'HashMap'),
86+
[TypeDefInfo.Int]: (registry: CodecRegistry, { length = 32 }: TypeDef) =>
8687
`Int<${length}>`,
87-
[TypeDefInfo.Linkage]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
88-
encodeWithParams(CodecRegistry, typeDef, 'Linkage'),
88+
[TypeDefInfo.Linkage]: (registry: CodecRegistry, typeDef: TypeDef) =>
89+
encodeWithParams(registry, typeDef, 'Linkage'),
8990
// eslint-disable-next-line @typescript-eslint/no-unused-vars
90-
[TypeDefInfo.Null]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
91+
[TypeDefInfo.Null]: (registry: CodecRegistry, typeDef: TypeDef) =>
9192
'Null',
92-
[TypeDefInfo.Option]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
93-
encodeWithParams(CodecRegistry, typeDef, 'Option'),
93+
[TypeDefInfo.Option]: (registry: CodecRegistry, typeDef: TypeDef) =>
94+
encodeWithParams(registry, typeDef, 'Option'),
9495
// eslint-disable-next-line @typescript-eslint/no-unused-vars
95-
[TypeDefInfo.Plain]: (CodecRegistry: CodecRegistry, { displayName, type }: TypeDef) =>
96+
[TypeDefInfo.Plain]: (registry: CodecRegistry, { displayName, type }: TypeDef) =>
9697
displayName || type,
97-
[TypeDefInfo.Range]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
98-
encodeWithParams(CodecRegistry, typeDef, typeDef.type.includes('RangeInclusive') ? 'RangeInclusive' : 'Range'),
99-
[TypeDefInfo.Result]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
100-
encodeWithParams(CodecRegistry, typeDef, 'Result'),
98+
[TypeDefInfo.Range]: (registry: CodecRegistry, typeDef: TypeDef) =>
99+
encodeWithParams(registry, typeDef, typeDef.type.includes('RangeInclusive') ? 'RangeInclusive' : 'Range'),
100+
[TypeDefInfo.Result]: (registry: CodecRegistry, typeDef: TypeDef) =>
101+
encodeWithParams(registry, typeDef, 'Result'),
101102
// eslint-disable-next-line @typescript-eslint/no-unused-vars
102-
[TypeDefInfo.Set]: (CodecRegistry: CodecRegistry, { length = 8, sub }: TypeDef): string => {
103+
[TypeDefInfo.Set]: (registry: CodecRegistry, { length = 8, sub }: TypeDef): string => {
103104
assert(sub && Array.isArray(sub), 'Unable to encode Set type');
104105

105106
return stringify({
@@ -109,12 +110,12 @@ const encoders: Record<TypeDefInfo, (CodecRegistry: CodecRegistry, typeDef: Type
109110
});
110111
},
111112
// eslint-disable-next-line @typescript-eslint/no-unused-vars
112-
[TypeDefInfo.Si]: (CodecRegistry: CodecRegistry, { lookupName, type }: TypeDef) =>
113+
[TypeDefInfo.Si]: (registry: CodecRegistry, { lookupName, type }: TypeDef) =>
113114
lookupName || type,
114-
[TypeDefInfo.Struct]: (CodecRegistry: CodecRegistry, { alias, sub }: TypeDef): string => {
115+
[TypeDefInfo.Struct]: (registry: CodecRegistry, { alias, sub }: TypeDef): string => {
115116
assert(sub && Array.isArray(sub), 'Unable to encode Struct type');
116117

117-
return encodeSubTypes(CodecRegistry, sub, false,
118+
return encodeSubTypes(registry, sub, false,
118119
alias
119120
? {
120121
_alias: [...alias.entries()].reduce<Record<string, string>>((all, [k, v]) =>
@@ -124,43 +125,43 @@ const encoders: Record<TypeDefInfo, (CodecRegistry: CodecRegistry, typeDef: Type
124125
: {}
125126
);
126127
},
127-
[TypeDefInfo.Tuple]: (CodecRegistry: CodecRegistry, { sub }: TypeDef): string => {
128+
[TypeDefInfo.Tuple]: (registry: CodecRegistry, { sub }: TypeDef): string => {
128129
assert(sub && Array.isArray(sub), 'Unable to encode Tuple type');
129130

130-
return `(${sub.map((type) => encodeTypeDef(CodecRegistry, type)).join(',')})`;
131+
return `(${sub.map((type) => encodeTypeDef(registry, type)).join(',')})`;
131132
},
132-
[TypeDefInfo.UInt]: (CodecRegistry: CodecRegistry, { length = 32 }: TypeDef) =>
133+
[TypeDefInfo.UInt]: (registry: CodecRegistry, { length = 32 }: TypeDef) =>
133134
`UInt<${length}>`,
134-
[TypeDefInfo.Vec]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
135-
encodeWithParams(CodecRegistry, typeDef, 'Vec'),
136-
[TypeDefInfo.VecFixed]: (CodecRegistry: CodecRegistry, { length, sub }: TypeDef): string => {
135+
[TypeDefInfo.Vec]: (registry: CodecRegistry, typeDef: TypeDef) =>
136+
encodeWithParams(registry, typeDef, 'Vec'),
137+
[TypeDefInfo.VecFixed]: (registry: CodecRegistry, { length, sub }: TypeDef): string => {
137138
assert(isNumber(length) && !isUndefined(sub) && !Array.isArray(sub), 'Unable to encode VecFixed type');
138139

139140
return `[${sub.type};${length}]`;
140141
},
141-
[TypeDefInfo.WrapperKeepOpaque]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
142-
encodeWithParams(CodecRegistry, typeDef, 'WrapperKeepOpaque'),
143-
[TypeDefInfo.WrapperOpaque]: (CodecRegistry: CodecRegistry, typeDef: TypeDef) =>
144-
encodeWithParams(CodecRegistry, typeDef, 'WrapperOpaque')
142+
[TypeDefInfo.WrapperKeepOpaque]: (registry: CodecRegistry, typeDef: TypeDef) =>
143+
encodeWithParams(registry, typeDef, 'WrapperKeepOpaque'),
144+
[TypeDefInfo.WrapperOpaque]: (registry: CodecRegistry, typeDef: TypeDef) =>
145+
encodeWithParams(registry, typeDef, 'WrapperOpaque')
145146
};
146147

147-
function encodeType (CodecRegistry: CodecRegistry, typeDef: TypeDef, withLookup = true): string {
148+
function encodeType (registry: CodecRegistry, typeDef: TypeDef, withLookup = true): string {
148149
return withLookup && typeDef.lookupName
149150
? typeDef.lookupName
150-
: encoders[typeDef.info](CodecRegistry, typeDef);
151+
: encoders[typeDef.info](registry, typeDef);
151152
}
152153

153-
export function encodeTypeDef (CodecRegistry: CodecRegistry, typeDef: TypeDef): string {
154+
export function encodeTypeDef (registry: CodecRegistry, typeDef: TypeDef): string {
154155
// In the case of contracts we do have the unfortunate situation where the displayName would
155156
// refer to "Option" when it is an option. For these, string it out, only using when actually
156157
// not a top-level element to be used
157158
return (typeDef.displayName && !INFO_WRAP.some((i) => typeDef.displayName === i))
158159
? typeDef.displayName
159-
: encodeType(CodecRegistry, typeDef);
160+
: encodeType(registry, typeDef);
160161
}
161162

162-
export function withTypeString (CodecRegistry: CodecRegistry, typeDef: Omit<TypeDef, 'type'> & { type?: string }): TypeDef {
163+
export function withTypeString (registry: CodecRegistry, typeDef: Omit<TypeDef, 'type'> & { type?: string }): TypeDef {
163164
return objectSpread({}, typeDef, {
164-
type: encodeType(CodecRegistry, typeDef as TypeDef, false)
165+
type: encodeType(registry, typeDef as TypeDef, false)
165166
});
166167
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright 2017-2022 @polkadot/types authors & contributors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import { TypeRegistry } from '../../create';
5+
import { PortableRegistry } from '.';
6+
7+
const registry = new TypeRegistry();
8+
const types = [
9+
{
10+
id: 0,
11+
type: {
12+
def: {
13+
composite: {
14+
fields: [
15+
{
16+
name: 'start',
17+
type: 1,
18+
typeName: 'Idx'
19+
},
20+
{
21+
name: 'end',
22+
type: 1,
23+
typeName: 'Idx'
24+
}
25+
]
26+
}
27+
},
28+
params: [
29+
{
30+
name: 'Idx',
31+
type: 1
32+
}
33+
],
34+
path: ['Range']
35+
}
36+
},
37+
{
38+
id: 1,
39+
type: {
40+
def: {
41+
primitive: 'U32'
42+
}
43+
}
44+
}
45+
];
46+
47+
describe('PortableRegistry/Range', (): void => {
48+
it('decodes a Range type', (): void => {
49+
expect(
50+
// override here is fine, Structs will decode correctly
51+
new PortableRegistry(registry, { types } as unknown as Uint8Array)
52+
.getTypeDef(0)
53+
.type
54+
).toEqual('Range<u32>');
55+
});
56+
});

packages/types/src/metadata/PortableRegistry/PortableRegistry.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -520,18 +520,7 @@ export class PortableRegistry extends Struct implements ILookup {
520520
} else if (['Range', 'RangeInclusive'].includes(pathFirst)) {
521521
return withTypeString(this.registry, {
522522
info: TypeDefInfo.Range,
523-
sub: fields.map(({ name, type, typeName }, index) =>
524-
objectSpread(
525-
{
526-
name: name.isSome
527-
? name.unwrap().toString()
528-
: ['start', 'end'][index]
529-
},
530-
this.#createSiDef(type),
531-
typeName.isSome
532-
? { typeName: sanitize(typeName.unwrap()) }
533-
: null
534-
)),
523+
sub: this.#createSiDef(params[0].type.unwrap()),
535524
type: pathFirst
536525
});
537526
} else if (['WrapperKeepOpaque', 'WrapperOpaque'].includes(pathLast)) {

0 commit comments

Comments
 (0)