lib/gvariant: Use more specific instructions for int and attrset
This commit is contained in:
parent
96e6f1a418
commit
29521b42cf
1 changed files with 59 additions and 0 deletions
|
@ -53,6 +53,53 @@ rec {
|
||||||
|
|
||||||
inherit type isGVariant;
|
inherit type isGVariant;
|
||||||
|
|
||||||
|
intConstructors = [
|
||||||
|
{
|
||||||
|
name = "mkInt32";
|
||||||
|
type = type.int32;
|
||||||
|
min = -2147483648;
|
||||||
|
max = 2147483647;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkUint32";
|
||||||
|
type = type.uint32;
|
||||||
|
min = 0;
|
||||||
|
max = 4294967295;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkInt64";
|
||||||
|
type = type.int64;
|
||||||
|
# Nix does not support such large numbers.
|
||||||
|
min = null;
|
||||||
|
max = null;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkUint64";
|
||||||
|
type = type.uint64;
|
||||||
|
min = 0;
|
||||||
|
# Nix does not support such large numbers.
|
||||||
|
max = null;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkInt16";
|
||||||
|
type = type.int16;
|
||||||
|
min = -32768;
|
||||||
|
max = 32767;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkUint16";
|
||||||
|
type = type.uint16;
|
||||||
|
min = 0;
|
||||||
|
max = 65535;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "mkUchar";
|
||||||
|
type = type.uchar;
|
||||||
|
min = 0;
|
||||||
|
max = 255;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
/* Returns the GVariant value that most closely matches the given Nix value.
|
/* Returns the GVariant value that most closely matches the given Nix value.
|
||||||
If no GVariant value can be found unambiguously then error is thrown.
|
If no GVariant value can be found unambiguously then error is thrown.
|
||||||
|
|
||||||
|
@ -70,6 +117,18 @@ rec {
|
||||||
mkArray v
|
mkArray v
|
||||||
else if isGVariant v then
|
else if isGVariant v then
|
||||||
v
|
v
|
||||||
|
else if builtins.isInt v then
|
||||||
|
let
|
||||||
|
validConstructors = builtins.filter ({ min, max, ... }: (min == null || min <= v) && (max == null || v <= max)) intConstructors;
|
||||||
|
in
|
||||||
|
throw ''
|
||||||
|
The GVariant type for number “${builtins.toString v}” is unclear.
|
||||||
|
Please wrap the value with one of the following, depending on the value type in GSettings schema:
|
||||||
|
|
||||||
|
${lib.concatMapStringsSep "\n" ({ name, type, ...}: "- `lib.gvariant.${name}` for `${type}`") validConstructors}
|
||||||
|
''
|
||||||
|
else if builtins.isAttrs v then
|
||||||
|
throw "Cannot construct GVariant value from an attribute set. If you want to construct a dictionary, you will need to create an array containing items constructed with `lib.gvariant.mkDictionaryEntry`."
|
||||||
else
|
else
|
||||||
throw "The GVariant type of “${builtins.typeOf v}” can't be inferred.";
|
throw "The GVariant type of “${builtins.typeOf v}” can't be inferred.";
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue