hyprland/vars: use HyprlandManager

parent ac10bb4e
......@@ -31,23 +31,25 @@ func HyprlandGetKeyboardLayouts() (string, error) {
func HyprlandSyncSystemLayouts(ctx context.Context, cmd *cli.Command) error {
force := cmd.Bool("force")
sysLayouts, err := HyprlandGetKeyboardLayouts()
manager, err := GetHyprlandManager(ctx)
if err != nil {
return fmt.Errorf("не удалось получить системные раскладки: %w", err)
return err
}
hyprLayouts, err := HyprlandVarGet("kb_layout")
sysLayouts, err := HyprlandGetKeyboardLayouts()
if err != nil {
return fmt.Errorf("не удалось получить kb_layout из Hyprland: %w", err)
return fmt.Errorf("не удалось получить системные раскладки: %w", err)
}
hyprLayouts := manager.GetVar("kb_layout")
if force || hyprLayouts == "" {
if _, err := HyprlandVarSet("kb_layout", sysLayouts); err != nil {
if _, err := manager.SetVar("kb_layout", sysLayouts); err != nil {
return fmt.Errorf("не удалось обновить kb_layout в Hyprland: %w", err)
}
color.Green("Раскладка обновлена!")
} else {
color.Red("Раскладка уже установлена, используйте '--force' для принудительного обновления.")
return fmt.Errorf("раскладка уже установлена, используйте '--force' для принудительного обновления")
}
return nil
......
......@@ -6,10 +6,8 @@ import (
"ximperconf/ui"
"ximperconf/utils"
"bufio"
"fmt"
"os"
"path/filepath"
"regexp"
"strings"
......@@ -17,70 +15,26 @@ import (
"github.com/urfave/cli/v3"
)
var (
reVarLine = regexp.MustCompile(`^\s*\$([A-Za-z0-9_]+)\s*=\s*(.*)`)
)
func hyprlandVarList() ([]string, error) {
if !utils.FileExists(config.Env.Hyprland.Config) {
color.Red("Конфигурация не найдена: %s", config.Env.Hyprland.Config)
return nil, nil
}
f, err := os.Open(config.Env.Hyprland.Config)
func HyprlandVarListCommand(ctx context.Context, cmd *cli.Command) error {
manager, err := GetHyprlandManager(ctx)
if err != nil {
return nil, err
return err
}
defer f.Close()
var vars []string
sc := bufio.NewScanner(f)
for sc.Scan() {
line := sc.Text()
if m := reVarLine.FindStringSubmatch(line); m != nil {
vars = append(vars, m[1])
}
for _, v := range manager.Vars {
fmt.Println(v.Name)
}
return vars, nil
}
func HyprlandVarListCommand(ctx context.Context, cmd *cli.Command) error {
vars, _ := hyprlandVarList()
fmt.Println(strings.Join(vars, "\n"))
return nil
}
func hyprlandVarInfo() (map[string]string, error) {
if !utils.FileExists(config.Env.Hyprland.Config) {
color.Red("Конфигурация не найдена: %s", config.Env.Hyprland.Config)
os.Exit(1)
}
f, err := os.Open(config.Env.Hyprland.Config)
func HyprlandVarInfoCommand(ctx context.Context, cmd *cli.Command) error {
manager, err := GetHyprlandManager(ctx)
if err != nil {
return nil, err
return err
}
defer f.Close()
vars := make(map[string]string)
sc := bufio.NewScanner(f)
for sc.Scan() {
line := sc.Text()
if m := reVarLine.FindStringSubmatch(line); m != nil {
name := m[1]
value := strings.TrimSpace(m[2])
if idx := strings.Index(value, "#"); idx != -1 {
value = strings.TrimSpace(value[:idx])
}
vars[name] = value
}
}
return vars, nil
}
func HyprlandVarInfoCommand(ctx context.Context, cmd *cli.Command) error {
info, _ := hyprlandVarInfo()
info := manager.GetVarList()
if len(info) == 0 {
color.Yellow("Нет переменных в конфигурации")
......@@ -88,13 +42,13 @@ func HyprlandVarInfoCommand(ctx context.Context, cmd *cli.Command) error {
}
items := make([]ui.TreeItem, 0, len(info))
for name, value := range info {
desc := value
for _, v := range info {
desc := v.Value
if desc == "" {
desc = "<empty>"
}
items = append(items, ui.TreeItem{
Name: name,
Name: v.Name,
Status: ui.StatusNo,
Description: desc,
})
......@@ -111,122 +65,28 @@ func HyprlandVarInfoCommand(ctx context.Context, cmd *cli.Command) error {
return nil
}
func HyprlandVarGet(name string) (string, error) {
if name == "" {
return "", fmt.Errorf("укажите имя переменной")
}
if !regexp.MustCompile(`^[A-Za-z_][A-Za-z0-9_]*$`).MatchString(name) {
return "", fmt.Errorf("недопустимое имя переменной: %s", name)
}
if !utils.FileExists(config.Env.Hyprland.Config) {
return "", fmt.Errorf("конфигурация не найдена: %s", config.Env.Hyprland.Config)
}
f, err := os.Open(config.Env.Hyprland.Config)
if err != nil {
return "", err
}
defer f.Close()
sc := bufio.NewScanner(f)
for sc.Scan() {
line := sc.Text()
if m := reVarLine.FindStringSubmatch(line); m != nil && m[1] == name {
value := strings.TrimSpace(m[2])
if idx := strings.Index(value, "#"); idx != -1 {
value = strings.TrimSpace(value[:idx])
}
return value, nil
}
}
return "", fmt.Errorf("переменная %s не найдена", name)
}
func HyprlandVarGetCommand(ctx context.Context, cmd *cli.Command) error {
info, err := HyprlandVarGet(cmd.Args().Get(0))
v := cmd.Args().Get(0)
manager, err := GetHyprlandManager(ctx)
if err != nil {
color.Red(err.Error())
return err
}
info := manager.GetVar(v)
if info == "" {
return fmt.Errorf("переменная '%s' не установлена", v)
}
fmt.Println(info)
return nil
}
func HyprlandVarSet(name, newValue string) (string, error) {
if name == "" {
return "", fmt.Errorf("укажите имя переменной")
}
if newValue == "" {
return "", fmt.Errorf("укажите новое значение")
}
if !regexp.MustCompile(`^[A-Za-z_][A-Za-z0-9_]*$`).MatchString(name) {
return "", fmt.Errorf("недопустимое имя переменной: %s", name)
}
path := config.Env.Hyprland.Config
if !utils.FileExists(path) {
_ = os.MkdirAll(filepath.Dir(path), 0755)
_ = os.WriteFile(path, []byte{}, 0644)
}
data, err := os.ReadFile(path)
if err != nil {
return "", err
}
lines := strings.Split(string(data), "\n")
changed := false
msg := ""
re := regexp.MustCompile(`^\s*\$` + regexp.QuoteMeta(name) + `\s*=`)
for i, l := range lines {
if re.MatchString(l) {
lines[i] = fmt.Sprintf("$%s = %s", name, newValue)
changed = true
msg = fmt.Sprintf("Переменная %s обновлена: %s", name, newValue)
}
}
if !changed {
var insertAt = -1
for i, l := range lines {
if strings.Contains(l, "ПЕРЕМЕННЫЕ") && strings.Contains(l, "VARS") {
insertAt = i + 1
break
}
}
if insertAt >= 0 {
// вставим после блока
before := append([]string{}, lines[:insertAt]...)
after := append([]string{fmt.Sprintf("$%s = %s", name, newValue)}, lines[insertAt:]...)
lines = append(before, after...)
msg = fmt.Sprintf("Переменная %s добавлена: %s", name, newValue)
} else {
// создаём блок VARS
lines = append(lines,
"",
"#---------- ПЕРЕМЕННЫЕ ---- VARS",
fmt.Sprintf("$%s = %s", name, newValue),
)
msg = fmt.Sprintf("Блок VARS создан, переменная %s добавлена: %s", name, newValue)
}
}
err = os.WriteFile(path, []byte(strings.Join(lines, "\n")), 0644)
func HyprlandVarSetCommand(ctx context.Context, cmd *cli.Command) error {
manager, err := GetHyprlandManager(ctx)
if err != nil {
return "", err
return err
}
return msg, nil
}
func HyprlandVarSetCommand(ctx context.Context, cmd *cli.Command) error {
msg, err := HyprlandVarSet(cmd.Args().Get(0), cmd.Args().Get(1))
msg, err := manager.SetVar(cmd.Args().Get(0), cmd.Args().Get(1))
if err != nil {
color.Red(err.Error())
return err
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment