69 lines
2.5 KiB
Bash
Executable File
69 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -e
|
|
|
|
# Nomarchy Nix State Sync
|
|
# Bridges the gap between runtime UI changes (state.json) and declarative
|
|
# Nix configuration (nomarchy-state.nix).
|
|
|
|
STATE_JSON="$HOME/.config/nomarchy/state.json"
|
|
NIX_STATE_FILE="/etc/nixos/nomarchy-state.nix"
|
|
|
|
# If state.json is missing, nothing to sync
|
|
if [ ! -f "$STATE_JSON" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Determine destination.
|
|
# If we are in the repo, we sync to ./nomarchy-state.nix (dev mode).
|
|
# Otherwise, we sync to /etc/nixos/nomarchy-state.nix (real install).
|
|
if [ -f "flake.nix" ] || [ -d ".git" ]; then
|
|
DEST="./nomarchy-state.nix"
|
|
elif [ -w "/etc/nixos" ]; then
|
|
DEST="$NIX_STATE_FILE"
|
|
else
|
|
# Nowhere to sync to
|
|
exit 0
|
|
fi
|
|
|
|
# Generate the Nix attribute set from JSON.
|
|
# We use jq to extract the keys and format them as Nix assignments.
|
|
# Note: font in state.json maps to fonts.monospace in Nix.
|
|
|
|
{
|
|
echo "# DO NOT EDIT MANUALLY - Managed by Nomarchy scripts."
|
|
echo "# This file mirrors your UI choices (theme, font, etc.) into the declarative"
|
|
echo "# Nix configuration. It is imported by your home.nix."
|
|
echo "{ lib, ... }:"
|
|
echo "{"
|
|
echo " nomarchy = {"
|
|
|
|
# Core UI strings
|
|
echo " theme = lib.mkDefault \"$(jq -r '.theme // empty' "$STATE_JSON")\";"
|
|
echo " fonts.monospace = lib.mkDefault \"$(jq -r '.font // empty' "$STATE_JSON")\";"
|
|
echo " panelPosition = lib.mkDefault \"$(jq -r '.panelPosition // empty' "$STATE_JSON")\";"
|
|
echo " wallpaper = lib.mkDefault \"$(jq -r '.wallpaper // empty' "$STATE_JSON")\";"
|
|
|
|
# Hyprland layout (numbers)
|
|
echo " hyprland = {"
|
|
echo " scale = lib.mkDefault \"$(jq -r '.hyprland.scale // "auto"' "$STATE_JSON")\";"
|
|
echo " gaps_in = lib.mkDefault $(jq -r '.hyprland.gaps_in // 5' "$STATE_JSON");"
|
|
echo " gaps_out = lib.mkDefault $(jq -r '.hyprland.gaps_out // 10' "$STATE_JSON");"
|
|
echo " border_size = lib.mkDefault $(jq -r '.hyprland.border_size // 2' "$STATE_JSON");"
|
|
echo " };"
|
|
|
|
# Toggles (booleans)
|
|
echo " toggles = {"
|
|
echo " suspend = lib.mkDefault $(jq -r '.suspend // true' "$STATE_JSON");"
|
|
echo " screensaver = lib.mkDefault $(jq -r '.screensaver // true' "$STATE_JSON");"
|
|
echo " idle = lib.mkDefault $(jq -r '.idle // true' "$STATE_JSON");"
|
|
echo " nightlight = lib.mkDefault $(jq -r '.nightlight // false' "$STATE_JSON");"
|
|
echo " waybar = lib.mkDefault $(jq -r '.waybar // true' "$STATE_JSON");"
|
|
echo " };"
|
|
|
|
echo " };"
|
|
echo "}"
|
|
} > "$DEST.tmp"
|
|
|
|
# Final atomic move
|
|
mv "$DEST.tmp" "$DEST"
|