@gtkx/runtime 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/variant.d.ts +85 -0
- package/dist/variant.d.ts.map +1 -0
- package/dist/variant.js +220 -0
- package/dist/variant.js.map +1 -0
- package/package.json +4 -4
- package/src/index.ts +2 -0
- package/src/variant.ts +427 -0
package/dist/index.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export { resolveType, TYPE_BOOLEAN, TYPE_BOXED, TYPE_CHAR, TYPE_DOUBLE, TYPE_ENU
|
|
|
30
30
|
/** @public */
|
|
31
31
|
export { getBoxedValue, setBoxedValue } from "./value.js";
|
|
32
32
|
/** @public */
|
|
33
|
+
export { fromVariant, toVariant, type VariantValue } from "./variant.js";
|
|
34
|
+
/** @public */
|
|
33
35
|
export { callParent, callVfunc } from "./vfunc-call.js";
|
|
34
36
|
/** @public */
|
|
35
37
|
export { alloc, type ExternalObject, type Handle, read, write } from "@gtkx/native";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/G,cAAc;AACd,OAAO,EAAE,KAAK,eAAe,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClG,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACvD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc;AACd,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc;AACd,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,cAAc;AACd,OAAO,EACH,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,UAAU,EACf,SAAS,EACT,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjH,cAAc;AACd,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,cAAc;AACd,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,KAAK,UAAU,EACf,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACpF,cAAc;AACd,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/G,cAAc;AACd,OAAO,EAAE,KAAK,eAAe,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClG,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACvD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc;AACd,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc;AACd,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,cAAc;AACd,OAAO,EACH,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,UAAU,EACf,SAAS,EACT,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjH,cAAc;AACd,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,cAAc;AACd,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,KAAK,UAAU,EACf,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACzE,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACpF,cAAc;AACd,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -30,6 +30,8 @@ export { resolveType, TYPE_BOOLEAN, TYPE_BOXED, TYPE_CHAR, TYPE_DOUBLE, TYPE_ENU
|
|
|
30
30
|
/** @public */
|
|
31
31
|
export { getBoxedValue, setBoxedValue } from "./value.js";
|
|
32
32
|
/** @public */
|
|
33
|
+
export { fromVariant, toVariant } from "./variant.js";
|
|
34
|
+
/** @public */
|
|
33
35
|
export { callParent, callVfunc } from "./vfunc-call.js";
|
|
34
36
|
/** @public */
|
|
35
37
|
export { alloc, read, write } from "@gtkx/native";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAsD,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/G,cAAc;AACd,OAAO,EAAwB,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClG,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAA6B,MAAM,gBAAgB,CAAC;AAC1G,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AACvD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc;AACd,OAAO,EAGH,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc;AACd,OAAO,EAAkB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,cAAc;AACd,OAAO,EACH,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EAEpB,SAAS,EACT,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AACjH,cAAc;AACd,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,cAAc;AACd,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc;AACd,OAAO,EAAE,KAAK,EAAoC,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACpF,cAAc;AACd,OAAO,EAAiB,MAAM,aAAa,CAAC","sourcesContent":["import \"./exit-hook.js\";\n\n/** @public */\nexport { type ApplicationClass, type CommandLineApplication, createApplication } from \"./application-class.js\";\n/** @public */\nexport { type ClosureCallback, ClosureMarshalError, toClosure, tryToClosure } from \"./closure.js\";\n/** @public */\nexport { createErrorDomain, type ErrorDomain } from \"./error.js\";\n/** @public */\nexport { onExit, quit, quitApplication, runApplication, type RunApplicationResult } from \"./lifecycle.js\";\n/** @public */\nexport { offSignal, onceSignal, onSignal } from \"./listeners.js\";\n/** @public */\nexport { installMixins, type Mixin } from \"./mixin.js\";\n/** @public */\nexport { fromNative, toNative } from \"./native-value.js\";\n/** @public */\nexport {\n type ConstructBinding,\n type ConstructBindings,\n getObjectProperty,\n newObjectWithProperties,\n registerConstructProperties,\n setObjectProperty,\n} from \"./object.js\";\n/** @public */\nexport { promisify } from \"./promisify.js\";\n/** @public */\nexport { type Interface, registerClass } from \"./register-class.js\";\n/** @public */\nexport {\n getClassType,\n getHandle,\n getInstanceType,\n getWrapperClass,\n registerInterface,\n registerWrapperClass,\n type StaticBase,\n setHandle,\n wrapHandle,\n} from \"./registry.js\";\n/** @public */\nexport { connectSignal, disconnectSignal, emitSignal, getSignalBaseName, type SignalHandler } from \"./signal.js\";\n/** @public */\nexport { t } from \"./t.js\";\n/** @public */\nexport {\n resolveType,\n TYPE_BOOLEAN,\n TYPE_BOXED,\n TYPE_CHAR,\n TYPE_DOUBLE,\n TYPE_ENUM,\n TYPE_FLAGS,\n TYPE_FLOAT,\n TYPE_GTYPE,\n TYPE_INT,\n TYPE_INT64,\n TYPE_INTERFACE,\n TYPE_INVALID,\n TYPE_LONG,\n TYPE_NONE,\n TYPE_OBJECT,\n TYPE_PARAM,\n TYPE_POINTER,\n TYPE_STRING,\n TYPE_UCHAR,\n TYPE_UINT,\n TYPE_UINT64,\n TYPE_ULONG,\n TYPE_UNICHAR,\n TYPE_VARIANT,\n type TypedClass,\n typeFromName,\n typeInterfaces,\n typeIsA,\n typeName,\n typeParent,\n valueIsA,\n} from \"./type.js\";\n/** @public */\nexport { getBoxedValue, setBoxedValue } from \"./value.js\";\n/** @public */\nexport { callParent, callVfunc } from \"./vfunc-call.js\";\n/** @public */\nexport { alloc, type ExternalObject, type Handle, read, write } from \"@gtkx/native\";\n/** @public */\nexport { type AnyClass } from \"@gtkx/utils\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAsD,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/G,cAAc;AACd,OAAO,EAAwB,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClG,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAA6B,MAAM,gBAAgB,CAAC;AAC1G,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AACvD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc;AACd,OAAO,EAGH,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc;AACd,OAAO,EAAkB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,cAAc;AACd,OAAO,EACH,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EAEpB,SAAS,EACT,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AACjH,cAAc;AACd,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,cAAc;AACd,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,SAAS,EAAqB,MAAM,cAAc,CAAC;AACzE,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc;AACd,OAAO,EAAE,KAAK,EAAoC,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACpF,cAAc;AACd,OAAO,EAAiB,MAAM,aAAa,CAAC","sourcesContent":["import \"./exit-hook.js\";\n\n/** @public */\nexport { type ApplicationClass, type CommandLineApplication, createApplication } from \"./application-class.js\";\n/** @public */\nexport { type ClosureCallback, ClosureMarshalError, toClosure, tryToClosure } from \"./closure.js\";\n/** @public */\nexport { createErrorDomain, type ErrorDomain } from \"./error.js\";\n/** @public */\nexport { onExit, quit, quitApplication, runApplication, type RunApplicationResult } from \"./lifecycle.js\";\n/** @public */\nexport { offSignal, onceSignal, onSignal } from \"./listeners.js\";\n/** @public */\nexport { installMixins, type Mixin } from \"./mixin.js\";\n/** @public */\nexport { fromNative, toNative } from \"./native-value.js\";\n/** @public */\nexport {\n type ConstructBinding,\n type ConstructBindings,\n getObjectProperty,\n newObjectWithProperties,\n registerConstructProperties,\n setObjectProperty,\n} from \"./object.js\";\n/** @public */\nexport { promisify } from \"./promisify.js\";\n/** @public */\nexport { type Interface, registerClass } from \"./register-class.js\";\n/** @public */\nexport {\n getClassType,\n getHandle,\n getInstanceType,\n getWrapperClass,\n registerInterface,\n registerWrapperClass,\n type StaticBase,\n setHandle,\n wrapHandle,\n} from \"./registry.js\";\n/** @public */\nexport { connectSignal, disconnectSignal, emitSignal, getSignalBaseName, type SignalHandler } from \"./signal.js\";\n/** @public */\nexport { t } from \"./t.js\";\n/** @public */\nexport {\n resolveType,\n TYPE_BOOLEAN,\n TYPE_BOXED,\n TYPE_CHAR,\n TYPE_DOUBLE,\n TYPE_ENUM,\n TYPE_FLAGS,\n TYPE_FLOAT,\n TYPE_GTYPE,\n TYPE_INT,\n TYPE_INT64,\n TYPE_INTERFACE,\n TYPE_INVALID,\n TYPE_LONG,\n TYPE_NONE,\n TYPE_OBJECT,\n TYPE_PARAM,\n TYPE_POINTER,\n TYPE_STRING,\n TYPE_UCHAR,\n TYPE_UINT,\n TYPE_UINT64,\n TYPE_ULONG,\n TYPE_UNICHAR,\n TYPE_VARIANT,\n type TypedClass,\n typeFromName,\n typeInterfaces,\n typeIsA,\n typeName,\n typeParent,\n valueIsA,\n} from \"./type.js\";\n/** @public */\nexport { getBoxedValue, setBoxedValue } from \"./value.js\";\n/** @public */\nexport { fromVariant, toVariant, type VariantValue } from \"./variant.js\";\n/** @public */\nexport { callParent, callVfunc } from \"./vfunc-call.js\";\n/** @public */\nexport { alloc, type ExternalObject, type Handle, read, write } from \"@gtkx/native\";\n/** @public */\nexport { type AnyClass } from \"@gtkx/utils\";\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
2
|
+
/** JavaScript type every GVariant basic type code unpacks to. */
|
|
3
|
+
type BasicValueMap = {
|
|
4
|
+
/** Boolean, held as a single byte reading 0 or 1. */
|
|
5
|
+
b: boolean;
|
|
6
|
+
/** Unsigned byte. */
|
|
7
|
+
y: number;
|
|
8
|
+
/** Signed 16-bit integer. */
|
|
9
|
+
n: number;
|
|
10
|
+
/** Unsigned 16-bit integer. */
|
|
11
|
+
q: number;
|
|
12
|
+
/** Signed 32-bit integer. */
|
|
13
|
+
i: number;
|
|
14
|
+
/** Unsigned 32-bit integer. */
|
|
15
|
+
u: number;
|
|
16
|
+
/** Index into the file descriptor list a message carries. */
|
|
17
|
+
h: number;
|
|
18
|
+
/** Double precision floating point number. */
|
|
19
|
+
d: number;
|
|
20
|
+
/** Signed 64-bit integer. */
|
|
21
|
+
x: bigint;
|
|
22
|
+
/** Unsigned 64-bit integer. */
|
|
23
|
+
t: bigint;
|
|
24
|
+
/** UTF-8 string, under no further constraint on what it holds. */
|
|
25
|
+
s: string;
|
|
26
|
+
/** D-Bus object path. */
|
|
27
|
+
o: string;
|
|
28
|
+
/** GVariant type signature. */
|
|
29
|
+
g: string;
|
|
30
|
+
/** Boxed variant holding a value of any type. */
|
|
31
|
+
v: GLib.Variant;
|
|
32
|
+
};
|
|
33
|
+
/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */
|
|
34
|
+
type BasicCode = keyof BasicValueMap;
|
|
35
|
+
/** Parses the element type of an array, yielding the array type it produces and the rest of the string. */
|
|
36
|
+
type ParseArray<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V[], R] : never;
|
|
37
|
+
/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */
|
|
38
|
+
type ParseMaybe<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V | null, R] : never;
|
|
39
|
+
/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */
|
|
40
|
+
type ParseTuple<S extends string, Acc extends unknown[]> = S extends `)${infer Rest}` ? [Acc, Rest] : [Parse<S>] extends [never] ? never : Parse<S> extends [infer V, infer R extends string] ? ParseTuple<R, [...Acc, V]> : never;
|
|
41
|
+
/** Types a dictionary entry key can hold. */
|
|
42
|
+
type DictKey = string | number | bigint | boolean;
|
|
43
|
+
/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */
|
|
44
|
+
type ParsePair<S extends string> = Parse<S> extends [infer K, infer R1 extends string] ? Parse<R1> extends [infer V, infer R2 extends string] ? R2 extends `}${infer R3}` ? [K] extends [DictKey] ? [K, V, R3] : never : never : never : never;
|
|
45
|
+
/**
|
|
46
|
+
* Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a
|
|
47
|
+
* `Map` otherwise, plus the rest of the string.
|
|
48
|
+
*/
|
|
49
|
+
type ParseDict<S extends string> = ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R] : never;
|
|
50
|
+
/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */
|
|
51
|
+
type ParseEntry<S extends string> = ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;
|
|
52
|
+
/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */
|
|
53
|
+
type ParseArrayOrDict<S extends string> = S extends `{${infer Rest}` ? ParseDict<Rest> : ParseArray<S>;
|
|
54
|
+
/**
|
|
55
|
+
* Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or
|
|
56
|
+
* `never` when the string is malformed.
|
|
57
|
+
*/
|
|
58
|
+
type Parse<S extends string> = S extends `a${infer Rest}` ? ParseArrayOrDict<Rest> : S extends `m${infer Rest}` ? ParseMaybe<Rest> : S extends `(${infer Rest}` ? ParseTuple<Rest, []> : S extends `{${infer Rest}` ? ParseEntry<Rest> : S extends `${infer C}${infer Rest}` ? C extends BasicCode ? [BasicValueMap[C], Rest] : never : never;
|
|
59
|
+
/** JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. */
|
|
60
|
+
type VariantValue<S extends string> = [Parse<S>] extends [never] ? unknown : Parse<S> extends [infer V, ""] ? V : unknown;
|
|
61
|
+
/**
|
|
62
|
+
* Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the
|
|
63
|
+
* nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a
|
|
64
|
+
* literal also types `value`, so `"as"` takes an array of strings, `"a{sv}"` a record of variants,
|
|
65
|
+
* `"(si)"` a string and a number pair, and a 64-bit type a `bigint`.
|
|
66
|
+
* @param typeString GVariant type of the variant to build, such as `"a{sv}"`.
|
|
67
|
+
* @param value Value to pack, shaped the way `typeString` describes.
|
|
68
|
+
* @returns The packed variant.
|
|
69
|
+
* @throws {Error} When the type string is not one complete GVariant type, or when a value packed as
|
|
70
|
+
* an object path or a type signature is not a valid one.
|
|
71
|
+
*/
|
|
72
|
+
declare const toVariant: <S extends string>(typeString: S, value: VariantValue<S>) => GLib.Variant;
|
|
73
|
+
/**
|
|
74
|
+
* Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse
|
|
75
|
+
* of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything
|
|
76
|
+
* else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or
|
|
77
|
+
* `null`, and a nested variant to the `GLib.Variant` itself.
|
|
78
|
+
* @param typeString GVariant type the variant holds, such as `"a{sv}"`.
|
|
79
|
+
* @param variant Variant to read, which has to hold that type.
|
|
80
|
+
* @returns The unpacked value, typed from `typeString` when it is given as a literal.
|
|
81
|
+
* @throws {Error} When the type string is not one complete GVariant type.
|
|
82
|
+
*/
|
|
83
|
+
declare const fromVariant: <S extends string>(typeString: S, variant: GLib.Variant) => VariantValue<S>;
|
|
84
|
+
export { fromVariant, toVariant, type VariantValue };
|
|
85
|
+
//# sourceMappingURL=variant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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"}
|
package/dist/variant.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
2
|
+
const BASIC_CODES = "bynqiuxthdsogv";
|
|
3
|
+
const STRING_KEY_CODES = new Set(["s", "o", "g"]);
|
|
4
|
+
const CONTAINER_PARSERS = {
|
|
5
|
+
a: parseArrayNode,
|
|
6
|
+
m: parseMaybeNode,
|
|
7
|
+
"(": parseTupleNode,
|
|
8
|
+
"{": parseEntryNode,
|
|
9
|
+
};
|
|
10
|
+
const parsedTypes = new Map();
|
|
11
|
+
const unpackBasic = {
|
|
12
|
+
b: (variant) => variant.getBoolean(),
|
|
13
|
+
y: (variant) => variant.getByte(),
|
|
14
|
+
n: (variant) => variant.getInt16(),
|
|
15
|
+
q: (variant) => variant.getUint16(),
|
|
16
|
+
i: (variant) => variant.getInt32(),
|
|
17
|
+
u: (variant) => variant.getUint32(),
|
|
18
|
+
h: (variant) => variant.getHandle(),
|
|
19
|
+
d: (variant) => variant.getDouble(),
|
|
20
|
+
x: (variant) => variant.getInt64(),
|
|
21
|
+
t: (variant) => variant.getUint64(),
|
|
22
|
+
s: (variant) => variant.getString()[0],
|
|
23
|
+
o: (variant) => variant.getString()[0],
|
|
24
|
+
g: (variant) => variant.getString()[0],
|
|
25
|
+
v: (variant) => variant.getVariant(),
|
|
26
|
+
};
|
|
27
|
+
const packBasic = {
|
|
28
|
+
b: (value) => GLib.Variant.newBoolean(value),
|
|
29
|
+
y: (value) => GLib.Variant.newByte(value),
|
|
30
|
+
n: (value) => GLib.Variant.newInt16(value),
|
|
31
|
+
q: (value) => GLib.Variant.newUint16(value),
|
|
32
|
+
i: (value) => GLib.Variant.newInt32(value),
|
|
33
|
+
u: (value) => GLib.Variant.newUint32(value),
|
|
34
|
+
h: (value) => GLib.Variant.newHandle(value),
|
|
35
|
+
d: (value) => GLib.Variant.newDouble(value),
|
|
36
|
+
x: (value) => GLib.Variant.newInt64(value),
|
|
37
|
+
t: (value) => GLib.Variant.newUint64(value),
|
|
38
|
+
s: (value) => GLib.Variant.newString(value),
|
|
39
|
+
o: packObjectPath,
|
|
40
|
+
g: packSignature,
|
|
41
|
+
v: (value) => GLib.Variant.newVariant(value),
|
|
42
|
+
};
|
|
43
|
+
const isBasicCode = (code) => BASIC_CODES.includes(code);
|
|
44
|
+
const isStringKeyed = (key) => key.kind === "basic" && STRING_KEY_CODES.has(key.code);
|
|
45
|
+
const invalidType = (source) => new Error(`Invalid GVariant type string "${source}"`);
|
|
46
|
+
const parsePair = (source, start) => {
|
|
47
|
+
const [key, keyEnd] = parseNode(source, start);
|
|
48
|
+
if (key.kind !== "basic" || key.code === "v") {
|
|
49
|
+
throw invalidType(source);
|
|
50
|
+
}
|
|
51
|
+
const [value, valueEnd] = parseNode(source, keyEnd);
|
|
52
|
+
if (source[valueEnd] !== "}") {
|
|
53
|
+
throw invalidType(source);
|
|
54
|
+
}
|
|
55
|
+
return [key, value, valueEnd + 1];
|
|
56
|
+
};
|
|
57
|
+
function parseArrayNode(source, start) {
|
|
58
|
+
if (source[start] === "{") {
|
|
59
|
+
const [key, value, end] = parsePair(source, start + 1);
|
|
60
|
+
return [{ kind: "dict", entryTypeString: source.slice(start, end), key, value }, end];
|
|
61
|
+
}
|
|
62
|
+
const [element, end] = parseNode(source, start);
|
|
63
|
+
return [{ kind: "array", elementTypeString: source.slice(start, end), element }, end];
|
|
64
|
+
}
|
|
65
|
+
function parseMaybeNode(source, start) {
|
|
66
|
+
const [element, end] = parseNode(source, start);
|
|
67
|
+
return [{ kind: "maybe", elementTypeString: source.slice(start, end), element }, end];
|
|
68
|
+
}
|
|
69
|
+
function parseTupleNode(source, start) {
|
|
70
|
+
const items = [];
|
|
71
|
+
let position = start;
|
|
72
|
+
while (source[position] !== ")") {
|
|
73
|
+
if (position >= source.length) {
|
|
74
|
+
throw invalidType(source);
|
|
75
|
+
}
|
|
76
|
+
const [item, end] = parseNode(source, position);
|
|
77
|
+
items.push(item);
|
|
78
|
+
position = end;
|
|
79
|
+
}
|
|
80
|
+
return [{ kind: "tuple", items }, position + 1];
|
|
81
|
+
}
|
|
82
|
+
function parseEntryNode(source, start) {
|
|
83
|
+
const [key, value, end] = parsePair(source, start);
|
|
84
|
+
return [{ kind: "entry", key, value }, end];
|
|
85
|
+
}
|
|
86
|
+
const parseNode = (source, start) => {
|
|
87
|
+
const code = source[start];
|
|
88
|
+
if (code === undefined) {
|
|
89
|
+
throw invalidType(source);
|
|
90
|
+
}
|
|
91
|
+
const container = CONTAINER_PARSERS[code];
|
|
92
|
+
if (container !== undefined) {
|
|
93
|
+
return container(source, start + 1);
|
|
94
|
+
}
|
|
95
|
+
if (isBasicCode(code)) {
|
|
96
|
+
return [{ kind: "basic", code }, start + 1];
|
|
97
|
+
}
|
|
98
|
+
throw invalidType(source);
|
|
99
|
+
};
|
|
100
|
+
const parseVariantType = (typeString) => {
|
|
101
|
+
const cached = parsedTypes.get(typeString);
|
|
102
|
+
if (cached !== undefined) {
|
|
103
|
+
return cached;
|
|
104
|
+
}
|
|
105
|
+
const [node, end] = parseNode(typeString, 0);
|
|
106
|
+
if (end !== typeString.length) {
|
|
107
|
+
throw invalidType(typeString);
|
|
108
|
+
}
|
|
109
|
+
parsedTypes.set(typeString, node);
|
|
110
|
+
return node;
|
|
111
|
+
};
|
|
112
|
+
const unpackChildren = (variant, unpackChild) => {
|
|
113
|
+
const children = [];
|
|
114
|
+
const count = variant.nChildren();
|
|
115
|
+
for (let index = 0; index < count; index += 1) {
|
|
116
|
+
children.push(unpackChild(variant.getChildValue(index)));
|
|
117
|
+
}
|
|
118
|
+
return children;
|
|
119
|
+
};
|
|
120
|
+
const unpackPair = (key, value, entry) => [
|
|
121
|
+
unpackNode(key, entry.getChildValue(0)),
|
|
122
|
+
unpackNode(value, entry.getChildValue(1)),
|
|
123
|
+
];
|
|
124
|
+
const unpackDict = (node, variant) => {
|
|
125
|
+
const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry));
|
|
126
|
+
if (!isStringKeyed(node.key)) {
|
|
127
|
+
return new Map(entries);
|
|
128
|
+
}
|
|
129
|
+
const stringEntries = entries.map(([key, value]) => [key, value]);
|
|
130
|
+
return Object.fromEntries(stringEntries);
|
|
131
|
+
};
|
|
132
|
+
const unpackMaybe = (element, variant) => {
|
|
133
|
+
const child = variant.getMaybe();
|
|
134
|
+
return child === null ? null : unpackNode(element, child);
|
|
135
|
+
};
|
|
136
|
+
const unpackNode = (node, variant) => {
|
|
137
|
+
switch (node.kind) {
|
|
138
|
+
case "basic": {
|
|
139
|
+
return unpackBasic[node.code](variant);
|
|
140
|
+
}
|
|
141
|
+
case "array": {
|
|
142
|
+
return unpackChildren(variant, (child) => unpackNode(node.element, child));
|
|
143
|
+
}
|
|
144
|
+
case "dict": {
|
|
145
|
+
return unpackDict(node, variant);
|
|
146
|
+
}
|
|
147
|
+
case "entry": {
|
|
148
|
+
return unpackPair(node.key, node.value, variant);
|
|
149
|
+
}
|
|
150
|
+
case "tuple": {
|
|
151
|
+
return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index)));
|
|
152
|
+
}
|
|
153
|
+
case "maybe": {
|
|
154
|
+
return unpackMaybe(node.element, variant);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const packValidatedString = (value, isValid, description, construct) => {
|
|
159
|
+
if (typeof value !== "string" || !isValid(value)) {
|
|
160
|
+
throw new Error(`"${String(value)}" is not a valid GVariant ${description}`);
|
|
161
|
+
}
|
|
162
|
+
return construct(value);
|
|
163
|
+
};
|
|
164
|
+
function packObjectPath(value) {
|
|
165
|
+
return packValidatedString(value, (path) => GLib.Variant.isObjectPath(path), "object path", (path) => GLib.Variant.newObjectPath(path));
|
|
166
|
+
}
|
|
167
|
+
function packSignature(value) {
|
|
168
|
+
return packValidatedString(value, (signature) => GLib.Variant.isSignature(signature), "type signature", (signature) => GLib.Variant.newSignature(signature));
|
|
169
|
+
}
|
|
170
|
+
const packEntry = (key, value, pair) => GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));
|
|
171
|
+
const dictEntries = (value) => value instanceof Map ? [...value] : Object.entries(value);
|
|
172
|
+
const packDict = (node, value) => GLib.Variant.newArray(GLib.VariantType.new(node.entryTypeString), dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)));
|
|
173
|
+
const packMaybe = (node, value) => GLib.Variant.newMaybe(GLib.VariantType.new(node.elementTypeString), value === null ? null : packNode(node.element, value));
|
|
174
|
+
const packNode = (node, value) => {
|
|
175
|
+
switch (node.kind) {
|
|
176
|
+
case "basic": {
|
|
177
|
+
return packBasic[node.code](value);
|
|
178
|
+
}
|
|
179
|
+
case "array": {
|
|
180
|
+
return GLib.Variant.newArray(GLib.VariantType.new(node.elementTypeString), value.map((item) => packNode(node.element, item)));
|
|
181
|
+
}
|
|
182
|
+
case "dict": {
|
|
183
|
+
return packDict(node, value);
|
|
184
|
+
}
|
|
185
|
+
case "entry": {
|
|
186
|
+
return packEntry(node.key, node.value, value);
|
|
187
|
+
}
|
|
188
|
+
case "tuple": {
|
|
189
|
+
return GLib.Variant.newTuple(node.items.map((item, index) => packNode(item, value[index])));
|
|
190
|
+
}
|
|
191
|
+
case "maybe": {
|
|
192
|
+
return packMaybe(node, value);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the
|
|
198
|
+
* nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a
|
|
199
|
+
* literal also types `value`, so `"as"` takes an array of strings, `"a{sv}"` a record of variants,
|
|
200
|
+
* `"(si)"` a string and a number pair, and a 64-bit type a `bigint`.
|
|
201
|
+
* @param typeString GVariant type of the variant to build, such as `"a{sv}"`.
|
|
202
|
+
* @param value Value to pack, shaped the way `typeString` describes.
|
|
203
|
+
* @returns The packed variant.
|
|
204
|
+
* @throws {Error} When the type string is not one complete GVariant type, or when a value packed as
|
|
205
|
+
* an object path or a type signature is not a valid one.
|
|
206
|
+
*/
|
|
207
|
+
const toVariant = (typeString, value) => packNode(parseVariantType(typeString), value);
|
|
208
|
+
/**
|
|
209
|
+
* Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse
|
|
210
|
+
* of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything
|
|
211
|
+
* else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or
|
|
212
|
+
* `null`, and a nested variant to the `GLib.Variant` itself.
|
|
213
|
+
* @param typeString GVariant type the variant holds, such as `"a{sv}"`.
|
|
214
|
+
* @param variant Variant to read, which has to hold that type.
|
|
215
|
+
* @returns The unpacked value, typed from `typeString` when it is given as a literal.
|
|
216
|
+
* @throws {Error} When the type string is not one complete GVariant type.
|
|
217
|
+
*/
|
|
218
|
+
const fromVariant = (typeString, variant) => unpackNode(parseVariantType(typeString), variant);
|
|
219
|
+
export { fromVariant, toVariant };
|
|
220
|
+
//# sourceMappingURL=variant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variant.js","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\n\n/** JavaScript type every GVariant basic type code unpacks to. */\ntype BasicValueMap = {\n /** Boolean, held as a single byte reading 0 or 1. */\n b: boolean;\n /** Unsigned byte. */\n y: number;\n /** Signed 16-bit integer. */\n n: number;\n /** Unsigned 16-bit integer. */\n q: number;\n /** Signed 32-bit integer. */\n i: number;\n /** Unsigned 32-bit integer. */\n u: number;\n /** Index into the file descriptor list a message carries. */\n h: number;\n /** Double precision floating point number. */\n d: number;\n /** Signed 64-bit integer. */\n x: bigint;\n /** Unsigned 64-bit integer. */\n t: bigint;\n /** UTF-8 string, under no further constraint on what it holds. */\n s: string;\n /** D-Bus object path. */\n o: string;\n /** GVariant type signature. */\n g: string;\n /** Boxed variant holding a value of any type. */\n v: GLib.Variant;\n};\n\n/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */\ntype BasicCode = keyof BasicValueMap;\n/** Parses the element type of an array, yielding the array type it produces and the rest of the string. */\ntype ParseArray<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V[], R] : never;\n/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */\ntype ParseMaybe<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V | null, R] : never;\n\n/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */\ntype ParseTuple<S extends string, Acc extends unknown[]> = S extends `)${infer Rest}`\n ? [Acc, Rest]\n : [Parse<S>] extends [never]\n ? never\n : Parse<S> extends [infer V, infer R extends string]\n ? ParseTuple<R, [...Acc, V]>\n : never;\n\n/** Types a dictionary entry key can hold. */\ntype DictKey = string | number | bigint | boolean;\n\n/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */\ntype ParsePair<S extends string> =\n Parse<S> extends [infer K, infer R1 extends string]\n ? Parse<R1> extends [infer V, infer R2 extends string]\n ? R2 extends `}${infer R3}`\n ? [K] extends [DictKey]\n ? [K, V, R3]\n : never\n : never\n : never\n : never;\n\n/**\n * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a\n * `Map` otherwise, plus the rest of the string.\n */\ntype ParseDict<S extends string> =\n ParsePair<S> extends [infer K, infer V, infer R extends string]\n ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]\n : never;\n\n/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */\ntype ParseEntry<S extends string> =\n ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;\n\n/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */\ntype ParseArrayOrDict<S extends string> = S extends `{${infer Rest}` ? ParseDict<Rest> : ParseArray<S>;\n\n/**\n * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or\n * `never` when the string is malformed.\n */\ntype Parse<S extends string> = S extends `a${infer Rest}`\n ? ParseArrayOrDict<Rest>\n : S extends `m${infer Rest}`\n ? ParseMaybe<Rest>\n : S extends `(${infer Rest}`\n ? ParseTuple<Rest, []>\n : S extends `{${infer Rest}`\n ? ParseEntry<Rest>\n : S extends `${infer C}${infer Rest}`\n ? C extends BasicCode\n ? [BasicValueMap[C], Rest]\n : never\n : never;\n\n/** JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. */\ntype VariantValue<S extends string> = [Parse<S>] extends [never]\n ? unknown\n : Parse<S> extends [infer V, \"\"]\n ? V\n : unknown;\n\ntype VariantTypeNode =\n | { kind: \"basic\"; code: BasicCode } |\n { kind: \"array\"; elementTypeString: string; element: VariantTypeNode } |\n { kind: \"dict\"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"entry\"; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"tuple\"; items: VariantTypeNode[] } |\n { kind: \"maybe\"; elementTypeString: string; element: VariantTypeNode };\n\nconst BASIC_CODES = \"bynqiuxthdsogv\";\nconst STRING_KEY_CODES: Set<string> = new Set([\"s\", \"o\", \"g\"]);\n\nconst CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {\n a: parseArrayNode,\n m: parseMaybeNode,\n \"(\": parseTupleNode,\n \"{\": parseEntryNode,\n};\n\nconst parsedTypes: Map<string, VariantTypeNode> = new Map();\n\nconst unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {\n b: (variant) => variant.getBoolean(),\n y: (variant) => variant.getByte(),\n n: (variant) => variant.getInt16(),\n q: (variant) => variant.getUint16(),\n i: (variant) => variant.getInt32(),\n u: (variant) => variant.getUint32(),\n h: (variant) => variant.getHandle(),\n d: (variant) => variant.getDouble(),\n x: (variant) => variant.getInt64(),\n t: (variant) => variant.getUint64(),\n s: (variant) => variant.getString()[0],\n o: (variant) => variant.getString()[0],\n g: (variant) => variant.getString()[0],\n v: (variant) => variant.getVariant(),\n};\n\nconst packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {\n b: (value) => GLib.Variant.newBoolean(value as boolean),\n y: (value) => GLib.Variant.newByte(value as number),\n n: (value) => GLib.Variant.newInt16(value as number),\n q: (value) => GLib.Variant.newUint16(value as number),\n i: (value) => GLib.Variant.newInt32(value as number),\n u: (value) => GLib.Variant.newUint32(value as number),\n h: (value) => GLib.Variant.newHandle(value as number),\n d: (value) => GLib.Variant.newDouble(value as number),\n x: (value) => GLib.Variant.newInt64(value as bigint),\n t: (value) => GLib.Variant.newUint64(value as bigint),\n s: (value) => GLib.Variant.newString(value as string),\n o: packObjectPath,\n g: packSignature,\n v: (value) => GLib.Variant.newVariant(value as GLib.Variant),\n};\n\nconst isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);\nconst isStringKeyed = (key: VariantTypeNode): boolean => key.kind === \"basic\" && STRING_KEY_CODES.has(key.code);\nconst invalidType = (source: string): Error => new Error(`Invalid GVariant type string \"${source}\"`);\n\nconst parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {\n const [key, keyEnd] = parseNode(source, start);\n\n if (key.kind !== \"basic\" || key.code === \"v\") {\n throw invalidType(source);\n }\n\n const [value, valueEnd] = parseNode(source, keyEnd);\n\n if (source[valueEnd] !== \"}\") {\n throw invalidType(source);\n }\n\n return [key, value, valueEnd + 1];\n};\n\nfunction parseArrayNode(source: string, start: number): [VariantTypeNode, number] {\n if (source[start] === \"{\") {\n const [key, value, end] = parsePair(source, start + 1);\n\n return [{ kind: \"dict\", entryTypeString: source.slice(start, end), key, value }, end];\n }\n\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"array\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"maybe\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseTupleNode(source: string, start: number): [VariantTypeNode, number] {\n const items: VariantTypeNode[] = [];\n let position = start;\n\n while (source[position] !== \")\") {\n if (position >= source.length) {\n throw invalidType(source);\n }\n\n const [item, end] = parseNode(source, position);\n items.push(item);\n position = end;\n }\n\n return [{ kind: \"tuple\", items }, position + 1];\n}\n\nfunction parseEntryNode(source: string, start: number): [VariantTypeNode, number] {\n const [key, value, end] = parsePair(source, start);\n\n return [{ kind: \"entry\", key, value }, end];\n}\n\nconst parseNode = (source: string, start: number): [VariantTypeNode, number] => {\n const code = source[start];\n\n if (code === undefined) {\n throw invalidType(source);\n }\n\n const container = CONTAINER_PARSERS[code];\n\n if (container !== undefined) {\n return container(source, start + 1);\n }\n\n if (isBasicCode(code)) {\n return [{ kind: \"basic\", code }, start + 1];\n }\n\n throw invalidType(source);\n};\n\nconst parseVariantType = (typeString: string): VariantTypeNode => {\n const cached = parsedTypes.get(typeString);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const [node, end] = parseNode(typeString, 0);\n\n if (end !== typeString.length) {\n throw invalidType(typeString);\n }\n\n parsedTypes.set(typeString, node);\n\n return node;\n};\n\nconst unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {\n const children: unknown[] = [];\n const count = variant.nChildren();\n\n for (let index = 0; index < count; index += 1) {\n children.push(unpackChild(variant.getChildValue(index)));\n }\n\n return children;\n};\n\nconst unpackPair = (key: VariantTypeNode, value: VariantTypeNode, entry: GLib.Variant): [unknown, unknown] => [\n unpackNode(key, entry.getChildValue(0)),\n unpackNode(value, entry.getChildValue(1)),\n];\n\nconst unpackDict = (\n node: { key: VariantTypeNode; value: VariantTypeNode },\n variant: GLib.Variant,\n): Record<string, unknown> | Map<unknown, unknown> => {\n const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry)) as [unknown, unknown][];\n\n if (!isStringKeyed(node.key)) {\n return new Map(entries);\n }\n\n const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);\n\n return Object.fromEntries(stringEntries);\n};\n\nconst unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant): unknown => {\n const child = variant.getMaybe();\n\n return child === null ? null : unpackNode(element, child);\n};\n\nconst unpackNode = (node: VariantTypeNode, variant: GLib.Variant): unknown => {\n switch (node.kind) {\n case \"basic\": {\n return unpackBasic[node.code](variant);\n }\n case \"array\": {\n return unpackChildren(variant, (child) => unpackNode(node.element, child));\n }\n case \"dict\": {\n return unpackDict(node, variant);\n }\n case \"entry\": {\n return unpackPair(node.key, node.value, variant);\n }\n case \"tuple\": {\n return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index)));\n }\n case \"maybe\": {\n return unpackMaybe(node.element, variant);\n }\n }\n};\n\nconst packValidatedString = (\n value: unknown,\n isValid: (value: string) => boolean,\n description: string,\n construct: (value: string) => GLib.Variant,\n): GLib.Variant => {\n if (typeof value !== \"string\" || !isValid(value)) {\n throw new Error(`\"${String(value)}\" is not a valid GVariant ${description}`);\n }\n\n return construct(value);\n};\n\nfunction packObjectPath(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (path) => GLib.Variant.isObjectPath(path),\n \"object path\",\n (path) => GLib.Variant.newObjectPath(path),\n );\n}\n\nfunction packSignature(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (signature) => GLib.Variant.isSignature(signature),\n \"type signature\",\n (signature) => GLib.Variant.newSignature(signature),\n );\n}\n\nconst packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>\n GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));\n\nconst dictEntries = (value: unknown): [unknown, unknown][] =>\n value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);\n\nconst packDict = (\n node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },\n value: unknown,\n): GLib.Variant =>\n GLib.Variant.newArray(\n GLib.VariantType.new(node.entryTypeString),\n dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),\n );\n\nconst packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>\n GLib.Variant.newMaybe(\n GLib.VariantType.new(node.elementTypeString),\n value === null ? null : packNode(node.element, value),\n );\n\nconst packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {\n switch (node.kind) {\n case \"basic\": {\n return packBasic[node.code](value);\n }\n case \"array\": {\n return GLib.Variant.newArray(\n GLib.VariantType.new(node.elementTypeString),\n (value as unknown[]).map((item) => packNode(node.element, item)),\n );\n }\n case \"dict\": {\n return packDict(node, value);\n }\n case \"entry\": {\n return packEntry(node.key, node.value, value as [unknown, unknown]);\n }\n case \"tuple\": {\n return GLib.Variant.newTuple(\n node.items.map((item, index) => packNode(item, (value as unknown[])[index])),\n );\n }\n case \"maybe\": {\n return packMaybe(node, value);\n }\n }\n};\n\n/**\n * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the\n * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a\n * literal also types `value`, so `\"as\"` takes an array of strings, `\"a{sv}\"` a record of variants,\n * `\"(si)\"` a string and a number pair, and a 64-bit type a `bigint`.\n * @param typeString GVariant type of the variant to build, such as `\"a{sv}\"`.\n * @param value Value to pack, shaped the way `typeString` describes.\n * @returns The packed variant.\n * @throws {Error} When the type string is not one complete GVariant type, or when a value packed as\n * an object path or a type signature is not a valid one.\n */\nconst toVariant = <S extends string>(typeString: S, value: VariantValue<S>): GLib.Variant =>\n packNode(parseVariantType(typeString), value);\n\n/**\n * Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse\n * of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything\n * else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or\n * `null`, and a nested variant to the `GLib.Variant` itself.\n * @param typeString GVariant type the variant holds, such as `\"a{sv}\"`.\n * @param variant Variant to read, which has to hold that type.\n * @returns The unpacked value, typed from `typeString` when it is given as a literal.\n * @throws {Error} When the type string is not one complete GVariant type.\n */\nconst fromVariant = <S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S> =>\n unpackNode(parseVariantType(typeString), variant) as VariantValue<S>;\n\nexport { fromVariant, toVariant, type VariantValue };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/runtime",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "FFI runtime the generated GTKX bindings call into: type descriptors, GValue marshalling, signals, GObject lifecycle",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -55,11 +55,11 @@
|
|
|
55
55
|
"node": ">=24"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@gtkx/
|
|
59
|
-
"@gtkx/
|
|
58
|
+
"@gtkx/native": "1.2.2",
|
|
59
|
+
"@gtkx/utils": "1.2.2"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"@gtkx/vitest": "1.2.
|
|
62
|
+
"@gtkx/vitest": "1.2.2"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"release": "tsx ../../scripts/release-package.ts"
|
package/src/index.ts
CHANGED
|
@@ -81,6 +81,8 @@ export {
|
|
|
81
81
|
/** @public */
|
|
82
82
|
export { getBoxedValue, setBoxedValue } from "./value.js";
|
|
83
83
|
/** @public */
|
|
84
|
+
export { fromVariant, toVariant, type VariantValue } from "./variant.js";
|
|
85
|
+
/** @public */
|
|
84
86
|
export { callParent, callVfunc } from "./vfunc-call.js";
|
|
85
87
|
/** @public */
|
|
86
88
|
export { alloc, type ExternalObject, type Handle, read, write } from "@gtkx/native";
|
package/src/variant.ts
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import * as GLib from "@gtkx/gi/glib";
|
|
2
|
+
|
|
3
|
+
/** JavaScript type every GVariant basic type code unpacks to. */
|
|
4
|
+
type BasicValueMap = {
|
|
5
|
+
/** Boolean, held as a single byte reading 0 or 1. */
|
|
6
|
+
b: boolean;
|
|
7
|
+
/** Unsigned byte. */
|
|
8
|
+
y: number;
|
|
9
|
+
/** Signed 16-bit integer. */
|
|
10
|
+
n: number;
|
|
11
|
+
/** Unsigned 16-bit integer. */
|
|
12
|
+
q: number;
|
|
13
|
+
/** Signed 32-bit integer. */
|
|
14
|
+
i: number;
|
|
15
|
+
/** Unsigned 32-bit integer. */
|
|
16
|
+
u: number;
|
|
17
|
+
/** Index into the file descriptor list a message carries. */
|
|
18
|
+
h: number;
|
|
19
|
+
/** Double precision floating point number. */
|
|
20
|
+
d: number;
|
|
21
|
+
/** Signed 64-bit integer. */
|
|
22
|
+
x: bigint;
|
|
23
|
+
/** Unsigned 64-bit integer. */
|
|
24
|
+
t: bigint;
|
|
25
|
+
/** UTF-8 string, under no further constraint on what it holds. */
|
|
26
|
+
s: string;
|
|
27
|
+
/** D-Bus object path. */
|
|
28
|
+
o: string;
|
|
29
|
+
/** GVariant type signature. */
|
|
30
|
+
g: string;
|
|
31
|
+
/** Boxed variant holding a value of any type. */
|
|
32
|
+
v: GLib.Variant;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */
|
|
36
|
+
type BasicCode = keyof BasicValueMap;
|
|
37
|
+
/** Parses the element type of an array, yielding the array type it produces and the rest of the string. */
|
|
38
|
+
type ParseArray<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V[], R] : never;
|
|
39
|
+
/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */
|
|
40
|
+
type ParseMaybe<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V | null, R] : never;
|
|
41
|
+
|
|
42
|
+
/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */
|
|
43
|
+
type ParseTuple<S extends string, Acc extends unknown[]> = S extends `)${infer Rest}`
|
|
44
|
+
? [Acc, Rest]
|
|
45
|
+
: [Parse<S>] extends [never]
|
|
46
|
+
? never
|
|
47
|
+
: Parse<S> extends [infer V, infer R extends string]
|
|
48
|
+
? ParseTuple<R, [...Acc, V]>
|
|
49
|
+
: never;
|
|
50
|
+
|
|
51
|
+
/** Types a dictionary entry key can hold. */
|
|
52
|
+
type DictKey = string | number | bigint | boolean;
|
|
53
|
+
|
|
54
|
+
/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */
|
|
55
|
+
type ParsePair<S extends string> =
|
|
56
|
+
Parse<S> extends [infer K, infer R1 extends string]
|
|
57
|
+
? Parse<R1> extends [infer V, infer R2 extends string]
|
|
58
|
+
? R2 extends `}${infer R3}`
|
|
59
|
+
? [K] extends [DictKey]
|
|
60
|
+
? [K, V, R3]
|
|
61
|
+
: never
|
|
62
|
+
: never
|
|
63
|
+
: never
|
|
64
|
+
: never;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a
|
|
68
|
+
* `Map` otherwise, plus the rest of the string.
|
|
69
|
+
*/
|
|
70
|
+
type ParseDict<S extends string> =
|
|
71
|
+
ParsePair<S> extends [infer K, infer V, infer R extends string]
|
|
72
|
+
? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]
|
|
73
|
+
: never;
|
|
74
|
+
|
|
75
|
+
/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */
|
|
76
|
+
type ParseEntry<S extends string> =
|
|
77
|
+
ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;
|
|
78
|
+
|
|
79
|
+
/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */
|
|
80
|
+
type ParseArrayOrDict<S extends string> = S extends `{${infer Rest}` ? ParseDict<Rest> : ParseArray<S>;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or
|
|
84
|
+
* `never` when the string is malformed.
|
|
85
|
+
*/
|
|
86
|
+
type Parse<S extends string> = S extends `a${infer Rest}`
|
|
87
|
+
? ParseArrayOrDict<Rest>
|
|
88
|
+
: S extends `m${infer Rest}`
|
|
89
|
+
? ParseMaybe<Rest>
|
|
90
|
+
: S extends `(${infer Rest}`
|
|
91
|
+
? ParseTuple<Rest, []>
|
|
92
|
+
: S extends `{${infer Rest}`
|
|
93
|
+
? ParseEntry<Rest>
|
|
94
|
+
: S extends `${infer C}${infer Rest}`
|
|
95
|
+
? C extends BasicCode
|
|
96
|
+
? [BasicValueMap[C], Rest]
|
|
97
|
+
: never
|
|
98
|
+
: never;
|
|
99
|
+
|
|
100
|
+
/** JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. */
|
|
101
|
+
type VariantValue<S extends string> = [Parse<S>] extends [never]
|
|
102
|
+
? unknown
|
|
103
|
+
: Parse<S> extends [infer V, ""]
|
|
104
|
+
? V
|
|
105
|
+
: unknown;
|
|
106
|
+
|
|
107
|
+
type VariantTypeNode =
|
|
108
|
+
| { kind: "basic"; code: BasicCode } |
|
|
109
|
+
{ kind: "array"; elementTypeString: string; element: VariantTypeNode } |
|
|
110
|
+
{ kind: "dict"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |
|
|
111
|
+
{ kind: "entry"; key: VariantTypeNode; value: VariantTypeNode } |
|
|
112
|
+
{ kind: "tuple"; items: VariantTypeNode[] } |
|
|
113
|
+
{ kind: "maybe"; elementTypeString: string; element: VariantTypeNode };
|
|
114
|
+
|
|
115
|
+
const BASIC_CODES = "bynqiuxthdsogv";
|
|
116
|
+
const STRING_KEY_CODES: Set<string> = new Set(["s", "o", "g"]);
|
|
117
|
+
|
|
118
|
+
const CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {
|
|
119
|
+
a: parseArrayNode,
|
|
120
|
+
m: parseMaybeNode,
|
|
121
|
+
"(": parseTupleNode,
|
|
122
|
+
"{": parseEntryNode,
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const parsedTypes: Map<string, VariantTypeNode> = new Map();
|
|
126
|
+
|
|
127
|
+
const unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {
|
|
128
|
+
b: (variant) => variant.getBoolean(),
|
|
129
|
+
y: (variant) => variant.getByte(),
|
|
130
|
+
n: (variant) => variant.getInt16(),
|
|
131
|
+
q: (variant) => variant.getUint16(),
|
|
132
|
+
i: (variant) => variant.getInt32(),
|
|
133
|
+
u: (variant) => variant.getUint32(),
|
|
134
|
+
h: (variant) => variant.getHandle(),
|
|
135
|
+
d: (variant) => variant.getDouble(),
|
|
136
|
+
x: (variant) => variant.getInt64(),
|
|
137
|
+
t: (variant) => variant.getUint64(),
|
|
138
|
+
s: (variant) => variant.getString()[0],
|
|
139
|
+
o: (variant) => variant.getString()[0],
|
|
140
|
+
g: (variant) => variant.getString()[0],
|
|
141
|
+
v: (variant) => variant.getVariant(),
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
const packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {
|
|
145
|
+
b: (value) => GLib.Variant.newBoolean(value as boolean),
|
|
146
|
+
y: (value) => GLib.Variant.newByte(value as number),
|
|
147
|
+
n: (value) => GLib.Variant.newInt16(value as number),
|
|
148
|
+
q: (value) => GLib.Variant.newUint16(value as number),
|
|
149
|
+
i: (value) => GLib.Variant.newInt32(value as number),
|
|
150
|
+
u: (value) => GLib.Variant.newUint32(value as number),
|
|
151
|
+
h: (value) => GLib.Variant.newHandle(value as number),
|
|
152
|
+
d: (value) => GLib.Variant.newDouble(value as number),
|
|
153
|
+
x: (value) => GLib.Variant.newInt64(value as bigint),
|
|
154
|
+
t: (value) => GLib.Variant.newUint64(value as bigint),
|
|
155
|
+
s: (value) => GLib.Variant.newString(value as string),
|
|
156
|
+
o: packObjectPath,
|
|
157
|
+
g: packSignature,
|
|
158
|
+
v: (value) => GLib.Variant.newVariant(value as GLib.Variant),
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);
|
|
162
|
+
const isStringKeyed = (key: VariantTypeNode): boolean => key.kind === "basic" && STRING_KEY_CODES.has(key.code);
|
|
163
|
+
const invalidType = (source: string): Error => new Error(`Invalid GVariant type string "${source}"`);
|
|
164
|
+
|
|
165
|
+
const parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {
|
|
166
|
+
const [key, keyEnd] = parseNode(source, start);
|
|
167
|
+
|
|
168
|
+
if (key.kind !== "basic" || key.code === "v") {
|
|
169
|
+
throw invalidType(source);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const [value, valueEnd] = parseNode(source, keyEnd);
|
|
173
|
+
|
|
174
|
+
if (source[valueEnd] !== "}") {
|
|
175
|
+
throw invalidType(source);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return [key, value, valueEnd + 1];
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
function parseArrayNode(source: string, start: number): [VariantTypeNode, number] {
|
|
182
|
+
if (source[start] === "{") {
|
|
183
|
+
const [key, value, end] = parsePair(source, start + 1);
|
|
184
|
+
|
|
185
|
+
return [{ kind: "dict", entryTypeString: source.slice(start, end), key, value }, end];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const [element, end] = parseNode(source, start);
|
|
189
|
+
|
|
190
|
+
return [{ kind: "array", elementTypeString: source.slice(start, end), element }, end];
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {
|
|
194
|
+
const [element, end] = parseNode(source, start);
|
|
195
|
+
|
|
196
|
+
return [{ kind: "maybe", elementTypeString: source.slice(start, end), element }, end];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function parseTupleNode(source: string, start: number): [VariantTypeNode, number] {
|
|
200
|
+
const items: VariantTypeNode[] = [];
|
|
201
|
+
let position = start;
|
|
202
|
+
|
|
203
|
+
while (source[position] !== ")") {
|
|
204
|
+
if (position >= source.length) {
|
|
205
|
+
throw invalidType(source);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const [item, end] = parseNode(source, position);
|
|
209
|
+
items.push(item);
|
|
210
|
+
position = end;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return [{ kind: "tuple", items }, position + 1];
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function parseEntryNode(source: string, start: number): [VariantTypeNode, number] {
|
|
217
|
+
const [key, value, end] = parsePair(source, start);
|
|
218
|
+
|
|
219
|
+
return [{ kind: "entry", key, value }, end];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const parseNode = (source: string, start: number): [VariantTypeNode, number] => {
|
|
223
|
+
const code = source[start];
|
|
224
|
+
|
|
225
|
+
if (code === undefined) {
|
|
226
|
+
throw invalidType(source);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const container = CONTAINER_PARSERS[code];
|
|
230
|
+
|
|
231
|
+
if (container !== undefined) {
|
|
232
|
+
return container(source, start + 1);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (isBasicCode(code)) {
|
|
236
|
+
return [{ kind: "basic", code }, start + 1];
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
throw invalidType(source);
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const parseVariantType = (typeString: string): VariantTypeNode => {
|
|
243
|
+
const cached = parsedTypes.get(typeString);
|
|
244
|
+
|
|
245
|
+
if (cached !== undefined) {
|
|
246
|
+
return cached;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const [node, end] = parseNode(typeString, 0);
|
|
250
|
+
|
|
251
|
+
if (end !== typeString.length) {
|
|
252
|
+
throw invalidType(typeString);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
parsedTypes.set(typeString, node);
|
|
256
|
+
|
|
257
|
+
return node;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {
|
|
261
|
+
const children: unknown[] = [];
|
|
262
|
+
const count = variant.nChildren();
|
|
263
|
+
|
|
264
|
+
for (let index = 0; index < count; index += 1) {
|
|
265
|
+
children.push(unpackChild(variant.getChildValue(index)));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return children;
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const unpackPair = (key: VariantTypeNode, value: VariantTypeNode, entry: GLib.Variant): [unknown, unknown] => [
|
|
272
|
+
unpackNode(key, entry.getChildValue(0)),
|
|
273
|
+
unpackNode(value, entry.getChildValue(1)),
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
const unpackDict = (
|
|
277
|
+
node: { key: VariantTypeNode; value: VariantTypeNode },
|
|
278
|
+
variant: GLib.Variant,
|
|
279
|
+
): Record<string, unknown> | Map<unknown, unknown> => {
|
|
280
|
+
const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry)) as [unknown, unknown][];
|
|
281
|
+
|
|
282
|
+
if (!isStringKeyed(node.key)) {
|
|
283
|
+
return new Map(entries);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);
|
|
287
|
+
|
|
288
|
+
return Object.fromEntries(stringEntries);
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
const unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant): unknown => {
|
|
292
|
+
const child = variant.getMaybe();
|
|
293
|
+
|
|
294
|
+
return child === null ? null : unpackNode(element, child);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
const unpackNode = (node: VariantTypeNode, variant: GLib.Variant): unknown => {
|
|
298
|
+
switch (node.kind) {
|
|
299
|
+
case "basic": {
|
|
300
|
+
return unpackBasic[node.code](variant);
|
|
301
|
+
}
|
|
302
|
+
case "array": {
|
|
303
|
+
return unpackChildren(variant, (child) => unpackNode(node.element, child));
|
|
304
|
+
}
|
|
305
|
+
case "dict": {
|
|
306
|
+
return unpackDict(node, variant);
|
|
307
|
+
}
|
|
308
|
+
case "entry": {
|
|
309
|
+
return unpackPair(node.key, node.value, variant);
|
|
310
|
+
}
|
|
311
|
+
case "tuple": {
|
|
312
|
+
return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index)));
|
|
313
|
+
}
|
|
314
|
+
case "maybe": {
|
|
315
|
+
return unpackMaybe(node.element, variant);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
const packValidatedString = (
|
|
321
|
+
value: unknown,
|
|
322
|
+
isValid: (value: string) => boolean,
|
|
323
|
+
description: string,
|
|
324
|
+
construct: (value: string) => GLib.Variant,
|
|
325
|
+
): GLib.Variant => {
|
|
326
|
+
if (typeof value !== "string" || !isValid(value)) {
|
|
327
|
+
throw new Error(`"${String(value)}" is not a valid GVariant ${description}`);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return construct(value);
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
function packObjectPath(value: unknown): GLib.Variant {
|
|
334
|
+
return packValidatedString(
|
|
335
|
+
value,
|
|
336
|
+
(path) => GLib.Variant.isObjectPath(path),
|
|
337
|
+
"object path",
|
|
338
|
+
(path) => GLib.Variant.newObjectPath(path),
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function packSignature(value: unknown): GLib.Variant {
|
|
343
|
+
return packValidatedString(
|
|
344
|
+
value,
|
|
345
|
+
(signature) => GLib.Variant.isSignature(signature),
|
|
346
|
+
"type signature",
|
|
347
|
+
(signature) => GLib.Variant.newSignature(signature),
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>
|
|
352
|
+
GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));
|
|
353
|
+
|
|
354
|
+
const dictEntries = (value: unknown): [unknown, unknown][] =>
|
|
355
|
+
value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);
|
|
356
|
+
|
|
357
|
+
const packDict = (
|
|
358
|
+
node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },
|
|
359
|
+
value: unknown,
|
|
360
|
+
): GLib.Variant =>
|
|
361
|
+
GLib.Variant.newArray(
|
|
362
|
+
GLib.VariantType.new(node.entryTypeString),
|
|
363
|
+
dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
const packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>
|
|
367
|
+
GLib.Variant.newMaybe(
|
|
368
|
+
GLib.VariantType.new(node.elementTypeString),
|
|
369
|
+
value === null ? null : packNode(node.element, value),
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
const packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {
|
|
373
|
+
switch (node.kind) {
|
|
374
|
+
case "basic": {
|
|
375
|
+
return packBasic[node.code](value);
|
|
376
|
+
}
|
|
377
|
+
case "array": {
|
|
378
|
+
return GLib.Variant.newArray(
|
|
379
|
+
GLib.VariantType.new(node.elementTypeString),
|
|
380
|
+
(value as unknown[]).map((item) => packNode(node.element, item)),
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
case "dict": {
|
|
384
|
+
return packDict(node, value);
|
|
385
|
+
}
|
|
386
|
+
case "entry": {
|
|
387
|
+
return packEntry(node.key, node.value, value as [unknown, unknown]);
|
|
388
|
+
}
|
|
389
|
+
case "tuple": {
|
|
390
|
+
return GLib.Variant.newTuple(
|
|
391
|
+
node.items.map((item, index) => packNode(item, (value as unknown[])[index])),
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
case "maybe": {
|
|
395
|
+
return packMaybe(node, value);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the
|
|
402
|
+
* nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a
|
|
403
|
+
* literal also types `value`, so `"as"` takes an array of strings, `"a{sv}"` a record of variants,
|
|
404
|
+
* `"(si)"` a string and a number pair, and a 64-bit type a `bigint`.
|
|
405
|
+
* @param typeString GVariant type of the variant to build, such as `"a{sv}"`.
|
|
406
|
+
* @param value Value to pack, shaped the way `typeString` describes.
|
|
407
|
+
* @returns The packed variant.
|
|
408
|
+
* @throws {Error} When the type string is not one complete GVariant type, or when a value packed as
|
|
409
|
+
* an object path or a type signature is not a valid one.
|
|
410
|
+
*/
|
|
411
|
+
const toVariant = <S extends string>(typeString: S, value: VariantValue<S>): GLib.Variant =>
|
|
412
|
+
packNode(parseVariantType(typeString), value);
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse
|
|
416
|
+
* of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything
|
|
417
|
+
* else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or
|
|
418
|
+
* `null`, and a nested variant to the `GLib.Variant` itself.
|
|
419
|
+
* @param typeString GVariant type the variant holds, such as `"a{sv}"`.
|
|
420
|
+
* @param variant Variant to read, which has to hold that type.
|
|
421
|
+
* @returns The unpacked value, typed from `typeString` when it is given as a literal.
|
|
422
|
+
* @throws {Error} When the type string is not one complete GVariant type.
|
|
423
|
+
*/
|
|
424
|
+
const fromVariant = <S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S> =>
|
|
425
|
+
unpackNode(parseVariantType(typeString), variant) as VariantValue<S>;
|
|
426
|
+
|
|
427
|
+
export { fromVariant, toVariant, type VariantValue };
|