mirror of
https://github.com/nix-community/home-manager
synced 2024-11-26 21:19:45 +01:00
nushell: create generator helpers
This commit is contained in:
parent
994a0baf7b
commit
edf15f1549
3 changed files with 89 additions and 0 deletions
|
@ -14,4 +14,5 @@ rec {
|
||||||
|
|
||||||
shell = import ./shell.nix { inherit lib; };
|
shell = import ./shell.nix { inherit lib; };
|
||||||
zsh = import ./zsh.nix { inherit lib; };
|
zsh = import ./zsh.nix { inherit lib; };
|
||||||
|
nushell = import ./nushell.nix { inherit lib; };
|
||||||
}
|
}
|
||||||
|
|
65
modules/lib/nushell.nix
Normal file
65
modules/lib/nushell.nix
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
{ lib }: rec {
|
||||||
|
mkNushellInline = expr: lib.setType "nushell-inline" { inherit expr; };
|
||||||
|
|
||||||
|
toNushell = { indent ? "", multiline ? true, asBindings ? false }@args:
|
||||||
|
v:
|
||||||
|
let
|
||||||
|
innerIndent = "${indent} ";
|
||||||
|
introSpace = if multiline then ''
|
||||||
|
|
||||||
|
${innerIndent}'' else
|
||||||
|
" ";
|
||||||
|
outroSpace = if multiline then ''
|
||||||
|
|
||||||
|
${indent}'' else
|
||||||
|
" ";
|
||||||
|
innerArgs = args // {
|
||||||
|
indent = if asBindings then indent else innerIndent;
|
||||||
|
asBindings = false;
|
||||||
|
};
|
||||||
|
concatItems = lib.concatStringsSep introSpace;
|
||||||
|
isNushellInline = lib.isType "nushell-inline";
|
||||||
|
|
||||||
|
generatedBindings = assert lib.assertMsg (badVarNames == [ ])
|
||||||
|
"Bad Nushell variable names: ${
|
||||||
|
lib.generators.toPretty { } badVarNames
|
||||||
|
}";
|
||||||
|
lib.concatStrings (lib.mapAttrsToList (key: value: ''
|
||||||
|
${indent}let ${key} = ${toNushell innerArgs value}
|
||||||
|
'') v);
|
||||||
|
|
||||||
|
isBadVarName = name:
|
||||||
|
# Extracted from https://github.com/nushell/nushell/blob/ebc7b80c23f777f70c5053cca428226b3fe00d30/crates/nu-parser/src/parser.rs#L33
|
||||||
|
# Variables with numeric or even empty names are allowed. The only requisite is not containing any of the following characters
|
||||||
|
let invalidVariableCharacters = ".[({+-*^/=!<>&|";
|
||||||
|
in lib.match "^[$]?[^${lib.escapeRegex invalidVariableCharacters}]+$"
|
||||||
|
name == null;
|
||||||
|
badVarNames = lib.filter isBadVarName (builtins.attrNames v);
|
||||||
|
in if asBindings then
|
||||||
|
generatedBindings
|
||||||
|
else if v == null then
|
||||||
|
"null"
|
||||||
|
else if lib.isInt v || lib.isFloat v || lib.isString v || lib.isBool v then
|
||||||
|
lib.strings.toJSON v
|
||||||
|
else if lib.isList v then
|
||||||
|
(if v == [ ] then
|
||||||
|
"[]"
|
||||||
|
else
|
||||||
|
"[${introSpace}${
|
||||||
|
concatItems (map (value: "${toNushell innerArgs value}") v)
|
||||||
|
}${outroSpace}]")
|
||||||
|
else if lib.isAttrs v then
|
||||||
|
(if isNushellInline v then
|
||||||
|
"(${v.expr})"
|
||||||
|
else if v == { } then
|
||||||
|
"{}"
|
||||||
|
else if lib.isDerivation v then
|
||||||
|
toString v
|
||||||
|
else
|
||||||
|
"{${introSpace}${
|
||||||
|
concatItems (lib.mapAttrsToList (key: value:
|
||||||
|
"${lib.strings.toJSON key}: ${toNushell innerArgs value}") v)
|
||||||
|
}${outroSpace}}")
|
||||||
|
else
|
||||||
|
abort "nushell.toNushell: type ${lib.typeOf v} is unsupported";
|
||||||
|
}
|
|
@ -107,4 +107,27 @@ in rec {
|
||||||
mergeDefaultOption loc defs;
|
mergeDefaultOption loc defs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nushellValue = let
|
||||||
|
valueType = types.nullOr (types.oneOf [
|
||||||
|
(lib.mkOptionType {
|
||||||
|
name = "nushell";
|
||||||
|
description = "Nushell inline value";
|
||||||
|
descriptionClass = "name";
|
||||||
|
check = lib.isType "nushell-inline";
|
||||||
|
})
|
||||||
|
types.bool
|
||||||
|
types.int
|
||||||
|
types.float
|
||||||
|
types.str
|
||||||
|
types.path
|
||||||
|
(types.attrsOf valueType // {
|
||||||
|
description = "attribute set of Nushell values";
|
||||||
|
descriptionClass = "name";
|
||||||
|
})
|
||||||
|
(types.listOf valueType // {
|
||||||
|
description = "list of Nushell values";
|
||||||
|
descriptionClass = "name";
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
in valueType;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue