about summary refs log tree commit diff
path: root/nixpkgs/pkgs/build-support/writers/data.nix
blob: 02f08b9ca0b619e9c64775d073d8f144d09d04a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
{ lib, pkgs, formats, runCommand }:
let
  inherit (lib)
    last
    optionalString
    types
    ;
in
{
  /**
    Creates a transformer function that writes input data to disk, transformed
    by both the `input` and `output` arguments.

    # Example

    ```nix
    writeJSON = makeDataWriter { input = builtins.toJSON; output = "cp $inputPath $out"; };
    myConfig = writeJSON "config.json" { hello = "world"; }
    ```

    # Type

    ```
    makeDataWriter :: input -> output -> nameOrPath -> data -> (any -> string) -> string -> string -> any -> derivation

    input :: T -> string: function that takes the nix data and returns a string
    output :: string: script that takes the $inputFile and write the result into $out
    nameOrPath :: string: if the name contains a / the files gets written to a sub-folder of $out. The derivation name is the basename of this argument.
    data :: T: the data that will be converted.
    ```
  */
  makeDataWriter = lib.warn "pkgs.writers.makeDataWriter is deprecated. Use pkgs.writeTextFile." ({ input ? lib.id, output ? "cp $inputPath $out" }: nameOrPath: data:
    assert lib.or (types.path.check nameOrPath) (builtins.match "([0-9A-Za-z._])[0-9A-Za-z._-]*" nameOrPath != null);
    let
      name = last (builtins.split "/" nameOrPath);
    in
    runCommand name
      {
        input = input data;
        passAsFile = [ "input" ];
      } ''
      ${output}

      ${optionalString (types.path.check nameOrPath) ''
        mv $out tmp
        mkdir -p $out/$(dirname "${nameOrPath}")
        mv tmp $out/${nameOrPath}
      ''}
    '');

  inherit (pkgs) writeText;

  /**
    Writes the content to a JSON file.

    # Example

    ```nix
    writeJSON "data.json" { hello = "world"; }
    ```
  */
  writeJSON = (pkgs.formats.json {}).generate;

  /**
    Writes the content to a TOML file.

    # Example

    ```nix
    writeTOML "data.toml" { hello = "world"; }
    ```
  */
  writeTOML = (pkgs.formats.toml {}).generate;

  /**
    Writes the content to a YAML file.

    # Example

    ```nix
    writeYAML "data.yaml" { hello = "world"; }
    ```
  */
  writeYAML = (pkgs.formats.yaml {}).generate;
}