Initial commit
This commit is contained in:
commit
b552960c30
47
configuration.nix
Normal file
47
configuration.nix
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./formatters
|
||||||
|
];
|
||||||
|
|
||||||
|
services.simple-app = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
port = 8080;
|
||||||
|
host = "0.0.0.0";
|
||||||
|
};
|
||||||
|
logging = {
|
||||||
|
level = "info";
|
||||||
|
file = "/var/log/simple-app.log";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.validated-app = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
port = 8080;
|
||||||
|
host = "0.0.0.0";
|
||||||
|
};
|
||||||
|
logging = {
|
||||||
|
level = "info";
|
||||||
|
file = "/var/log/simple-app.log";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.multi-config-app = {
|
||||||
|
enable = true;
|
||||||
|
serverSettings = {
|
||||||
|
port = 8000;
|
||||||
|
host = "0.0.0.0";
|
||||||
|
};
|
||||||
|
databaseSettings = {
|
||||||
|
url = "postgres://localhost/myapp";
|
||||||
|
maxConnections = 50;
|
||||||
|
};
|
||||||
|
loggingSettings = {
|
||||||
|
level = "warn";
|
||||||
|
format = "text";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
58
formatters/basic-formatters.nix
Normal file
58
formatters/basic-formatters.nix
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{pkgs ? import <nixpkgs> {}}: let
|
||||||
|
# Initialize formatters
|
||||||
|
yamlFormat = pkgs.formats.yaml {};
|
||||||
|
jsonFormat = pkgs.formats.json {};
|
||||||
|
tomlFormat = pkgs.formats.toml {};
|
||||||
|
iniFormat = pkgs.formats.ini {};
|
||||||
|
|
||||||
|
# Example configuration data
|
||||||
|
exampleConfig = {
|
||||||
|
server = {
|
||||||
|
host = "localhost";
|
||||||
|
port = 8080;
|
||||||
|
};
|
||||||
|
database = {
|
||||||
|
url = "postgres://user:pass@localhost/db";
|
||||||
|
maxConnections = 100;
|
||||||
|
};
|
||||||
|
logging = {
|
||||||
|
level = "info";
|
||||||
|
file = "/var/log/app.log";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Generate files with each formatter
|
||||||
|
yamlFile = yamlFormat.generate "config.yaml" exampleConfig;
|
||||||
|
jsonFile = jsonFormat.generate "config.json" exampleConfig;
|
||||||
|
tomlFile = tomlFormat.generate "config.toml" exampleConfig;
|
||||||
|
iniFile = iniFormat.generate "config.ini" exampleConfig;
|
||||||
|
in
|
||||||
|
pkgs.runCommand "formatter-examples" {} ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp ${yamlFile} $out/config.yaml
|
||||||
|
cp ${jsonFile} $out/config.json
|
||||||
|
cp ${tomlFile} $out/config.toml
|
||||||
|
cp ${iniFile} $out/config.ini
|
||||||
|
|
||||||
|
# Create a simple script to display the files
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cat > $out/bin/show-configs <<EOF
|
||||||
|
#!/bin/sh
|
||||||
|
echo "=== YAML Configuration ==="
|
||||||
|
cat $out/config.yaml
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=== JSON Configuration ==="
|
||||||
|
cat $out/config.json
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=== TOML Configuration ==="
|
||||||
|
cat $out/config.toml
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=== INI Configuration ==="
|
||||||
|
cat $out/config.ini
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x $out/bin/show-configs
|
||||||
|
''
|
7
formatters/default.nix
Normal file
7
formatters/default.nix
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./yaml-module.nix
|
||||||
|
./validated-app.nix
|
||||||
|
./multiple-files.nix
|
||||||
|
];
|
||||||
|
}
|
67
formatters/multiple-files.nix
Normal file
67
formatters/multiple-files.nix
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.services.multi-config-app;
|
||||||
|
|
||||||
|
format = pkgs.formats.yaml {};
|
||||||
|
|
||||||
|
# Generate multiple config files
|
||||||
|
serverConfigFile = format.generate "server.yaml" cfg.serverSettings;
|
||||||
|
databaseConfigFile = format.generate "database.yaml" cfg.databaseSettings;
|
||||||
|
loggingConfigFile = format.generate "logging.yaml" cfg.loggingSettings;
|
||||||
|
|
||||||
|
# Create a directory with all configs
|
||||||
|
configDir = pkgs.runCommand "multi-config-app-configs" {} ''
|
||||||
|
mkdir -p $out
|
||||||
|
cp ${serverConfigFile} $out/server.yaml
|
||||||
|
cp ${databaseConfigFile} $out/database.yaml
|
||||||
|
cp ${loggingConfigFile} $out/logging.yaml
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
options.services.multi-config-app = {
|
||||||
|
enable = mkEnableOption "Multi-Configuration Application";
|
||||||
|
|
||||||
|
serverSettings = mkOption {
|
||||||
|
description = "Server configuration";
|
||||||
|
type = format.type;
|
||||||
|
default = {
|
||||||
|
port = 8080;
|
||||||
|
host = "127.0.0.1";
|
||||||
|
workers = 4;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
databaseSettings = mkOption {
|
||||||
|
description = "Database configuration";
|
||||||
|
type = format.type;
|
||||||
|
default = {
|
||||||
|
url = "postgres://localhost/app";
|
||||||
|
maxConnections = 20;
|
||||||
|
timeout = 30;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
loggingSettings = mkOption {
|
||||||
|
description = "Logging configuration";
|
||||||
|
type = format.type;
|
||||||
|
default = {
|
||||||
|
level = "info";
|
||||||
|
format = "json";
|
||||||
|
output = "stdout";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
# For demonstration purposes, copy the generated configs to /tmp
|
||||||
|
system.activationScripts.multiConfigApp = ''
|
||||||
|
mkdir -p /tmp/multi-config-app
|
||||||
|
cp -r ${configDir}/* /tmp/multi-config-app/
|
||||||
|
echo "Multi-config app configs generated at /tmp/multi-config-app/"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
78
formatters/validated-app.nix
Normal file
78
formatters/validated-app.nix
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.services.validated-app;
|
||||||
|
|
||||||
|
format = pkgs.formats.yaml {};
|
||||||
|
|
||||||
|
configFile = format.generate "validated-app.yaml" cfg.settings;
|
||||||
|
in {
|
||||||
|
options.services.validated-app = {
|
||||||
|
enable = mkEnableOption "Validated Application";
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
description = "Configuration for Validated Application";
|
||||||
|
type = types.submodule {
|
||||||
|
freeformType = format.type;
|
||||||
|
options = {
|
||||||
|
server = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
port = mkOption {
|
||||||
|
type = types.port;
|
||||||
|
default = 8080;
|
||||||
|
description = "Port to listen on";
|
||||||
|
};
|
||||||
|
host = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "127.0.0.1";
|
||||||
|
description = "Host to bind to";
|
||||||
|
};
|
||||||
|
workers = mkOption {
|
||||||
|
type = types.ints.positive;
|
||||||
|
default = 4;
|
||||||
|
description = "Number of worker processes";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
default = {};
|
||||||
|
description = "Server configuration";
|
||||||
|
};
|
||||||
|
|
||||||
|
logging = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
level = mkOption {
|
||||||
|
type = types.enum ["debug" "info" "warn" "error"];
|
||||||
|
default = "info";
|
||||||
|
description = "Logging level";
|
||||||
|
};
|
||||||
|
file = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = null;
|
||||||
|
description = "Log file path (null for stdout)";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
default = {};
|
||||||
|
description = "Logging configuration";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
# For demonstration purposes, copy the generated config to /tmp
|
||||||
|
system.activationScripts.validatedAppConfig = ''
|
||||||
|
mkdir -p /tmp/validated-app
|
||||||
|
cp ${configFile} /tmp/validated-app/config.yaml
|
||||||
|
echo "Validated app config generated at /tmp/validated-app/config.yaml"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
41
formatters/yaml-module.nix
Normal file
41
formatters/yaml-module.nix
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.services.simple-app;
|
||||||
|
|
||||||
|
format = pkgs.formats.yaml {};
|
||||||
|
|
||||||
|
configFile = format.generate "simple-app.yaml" cfg.settings;
|
||||||
|
in {
|
||||||
|
options.services.simple-app = {
|
||||||
|
enable = mkEnableOption "Simple Application";
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
description = "Configuration for Simple Application";
|
||||||
|
type = format.type;
|
||||||
|
default = {};
|
||||||
|
example = {
|
||||||
|
server = {
|
||||||
|
port = 8080;
|
||||||
|
host = "0.0.0.0";
|
||||||
|
};
|
||||||
|
logging = {
|
||||||
|
level = "info";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
# For demonstration purposes, copy the generated config to /tmp
|
||||||
|
system.activationScripts.simpleAppConfig = ''
|
||||||
|
mkdir -p /tmp/simple-app
|
||||||
|
cp ${configFile} /tmp/simple-app/config.yaml
|
||||||
|
echo "Simple app config generated at /tmp/simple-app/config.yaml"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user