nix2lua/README.md

345 lines
6.2 KiB
Markdown

# nix2lua
This is a small but functional library that converts your nix configurations
into Lua format.
This library was initially designed for my personal
[Neovim flake](https://git.pleshevski.ru/mynix/neovim).
# Installation
Add `nix2lua` as input to your `flake.nix`
```nix
{
inputs.nix2lua.url = "git+https://git.pleshevski.ru/mynix/nix2lua";
outputs = { nix2lua }:
let
luaTable = nix2lua.lib.toLua {
foo = "bar";
nvimTree.settings = {
open_on_setup = true;
renderer = {
group_empty = true;
full_name = true;
};
};
};
in luaTable;
}
```
# References
`toLua expr`
> Returns a string containing Lua representation of `expr`. Strings, integers,
> floats, boolean, lists and sets are mapped to their Lua equivalents.
>
> Null will be skipped. This is useful when you want to use an optional value.
> To render `nil` you should use the `LuaNil` function.
>
> ```nix
> toLua { foo = "bar"; }
> # { foo = "bar" }
> toLua [ 10 "foo" [ "bar" ] ]
> #`{ 10, "foo", { "bar" } }
> ```
`LuaNil`
> Creates a type that will be mapped by the `toLua` as `nil`
>
> ```nix
> toLua LuaNil
> # nil
> ```
`raw expr`
> Creates a type that instructs `toLua` not to change the passed expression
> `expr`.
>
> ```nix
> toLua (raw "require('bar').baz")
> # require('bar').baz
> ```
`namedField name expr` (alias: `nf`)
> Creates a type that represents a named field in the Lua table. This type
> cannot exist outside a list or set.
>
> This is useful to create table with some named fields.
>
> ```nix
> toLua [
> "foo"
> (namedField "bar" "baz")
> ]
> # { "foo", bar = "baz" }
> ```
`join sep expr`
> Join expressions with a separator
>
> ```nix
> toLua (join "=" ["vim.opt.line" true])
> # vim.opt.line = true
> ```
`concat expr`
> Joins expressions with an empty string separator
>
> This is alias for `join ""`
>
> ```nix
> toLua (concat ["hello" "world"])
> # helloworld
> ```
`pipe expr`
> Joins expressions with a '.' (dot) separator. If list of expressions contains
> a string it will convert to the raw.
>
> ```nix
> toLua (pipe ["vim" "opt" "line"]);
> # vim.opt.line
> ```
>
> ```nix
> toLua (pipe ["luasnip" (call0 "setup")]);
> # luasnip.setup()
> ```
`pipe1 lhs rhs`
> Useful alias for pipe that allow only two arguments.
>
> ```nix
> toLua (pipe1 "luasnip" (call0 "setup"));
> # luasnip.setup()
> ```
`spaceBetween expr`
> Join expressions with a space separator. You can use it to separate all
> expressions in the Lua configuration.
>
> This is alias for `join " "`
>
> ```nix
> toLua (spaceBetween [
> (set "vim.opt.number" true)
> (set "vim.opt.relatednumber" true)
> ])
> # vim.opt.number = true vim.opt.relatednumber = true
> ```
`call fnName args`
> Util to call a Lua function with arguments.
>
> If `args` is list that each list item render as function argument. Otherwise,
> it will be rendered as first argument.
>
> ```nix
> toLua (call "setup" [ "foo" "bar" ]);
> # setup("foo", "bar")
> ```
>
> ```nix
> toLua (call "setup" { foo = "bar" });
> # or: toLua (call "setup" [{ foo = "bar" }]);
> # setup({ foo = "bar" })
> ```
`call0 fnName`
> Call a Lua function without arguments.
>
> This is alias for `call fnName []`.
>
> ```nix
> toLua (call0 "setup")
> # setup()
> ```
`call1 fnName arg`
> Call a Lua function with one argument. This is useful when a Lua function has
> only one argument of type list, and we want to avoid using an inner list.
>
> This is alias for `call fnName [arg]`.
>
> ```nix
> toLua (call1 "setup" [ "foo" "bar" ])
> # setup({ "foo", "bar" })
> ```
`require name`
> Call a require function to import module with `name`.
>
> This is alias for `call "require" name`.
>
> ```nix
> toLua (require "luasnip")
> # require("luasnip")
> ```
`op operation lhs rhs`
> Make Lua basic operation.
>
> ```nix
> toLua (op "+" 1 2)
> # (1 + 2)
> ```
>
> There are all aliases for basic Lua operations:
>
> ```
> add = op "+";
> sub = op "-";
> mul = op "*";
> div = op "/";
> mod = op "%";
> exp = op "^";
>
> eq = op "==";
> ne = op "~=";
> gt = op ">";
> lt = op "<";
> gte = op ">=";
> lte = op "<=";
>
> and = op kw_and;
> or' = op kw_or;
> not = expr: spaceBetween [ kw_not expr ];
> ```
`set varName expr`
> Set an expression to a Lua variable.
>
> ```nix
> toLua (set "vim.opt.number" true);
> # vim.opt.number = true
> ```
>
> Useful aliases:
>
> ```
> lset = l: r: local (set l r);
> ```
`func fnName params body`
> Define a function with specific name, parameters and body.
>
> ```nix
> toLua (func "foo" ["bar"] (pipe1 "bar" (call0 "baz"));
> # function foo(bar) bar.baz() end
> ```
>
> Useful aliases:
>
> ```
> func0 = fnName: func fnName [ ];
>
> lfunc = n: p: b: local (func n p b);
> lfunc0 = n: b: local (func0 n b);
> ```
`lambda params body`
> Define a lambda function with specific parameters and body. Useful to use Lua
> function inline.
>
> ```nix
> toLua (call "setup" {
> on_attach = lambda ["baz"] (pipe1 "baz" (call0 "bar"))
> });
> # setup { on_attach = function (baz) baz.bar() end }
> ```
>
> Useful aliases:
>
> ```
> lambda0 = lambda [ ];
> ```
`local expr`
> A modifier to define a variable or a function in local scope.
>
> ```nix
> toLua (local (set "luasnip" (require "luasnip")));
> # local set luasnip = require("luasnip")
> ```
> ```nix
> toLua (local (func "foo" ["bar"] (pipe1 "bar" (call0 "baz")));
> # local function foo(bar) bar.baz() end
> ```
`return expr`
> Return expression from a function.
>
> ```nix
> toLua (func "foo" ["bar"] (return (pipe1 "bar" "baz"));
> # function foo(bar) return bar.baz end
> ```
>
> Useful aliases:
>
> ```
> return_void = return null;
> ```
`ifelse condition trueBody falseBody`
> Make a Lua if else statement.
>
> ```nix
> toLua (ifelse (eq 10 10) (call "print" "yes") (call "print" "no"));
> # if (10 == 10) print("yes") else print("no") end
> ```
`if' condition trueBody`
> Make a Lua if statement without else.
>
> ```nix
> toLua (if' (eq 10 10) (call "print" "yes"));
> # if (10 == 10) print("yes") end
> ```
`do body`
> Limit scope of the variables
>
> ```nix
> toLua (do [(requireTo "foo" "foo")])
> # do local set foo = require("foo") end
> ```
>
> Aliases:
>
> ```
> scope = do
> ```
# License
GNU General Public License v3.0 or later
See [COPYING](./COPYING) to see the full text.