From 26639e50682ecb0f7373935de2dbc8d1d2319226 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Thu, 28 Apr 2022 15:24:04 +0300 Subject: Add support for getting config directories --- xdg.zig | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'xdg.zig') diff --git a/xdg.zig b/xdg.zig index 8466066..a8f3aad 100644 --- a/xdg.zig +++ b/xdg.zig @@ -1,6 +1,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; +const ArrayList = std.ArrayList; const Dir = std.fs.Dir; pub fn getDataHome(allocator: Allocator, app_name: []const u8) ![]u8 { @@ -15,6 +16,18 @@ pub fn getDataHome(allocator: Allocator, app_name: []const u8) ![]u8 { return error.HomeNotFound; } +pub fn getConfigHome(allocator: Allocator, app_name: []const u8) ![]u8 { + if (std.os.getenv("XDG_CONFIG_HOME")) |config_home| { + return std.fs.path.join(allocator, &.{ config_home, app_name }); + } + + if (std.os.getenv("HOME")) |home| { + return std.fs.path.join(allocator, &.{ home, ".config", app_name }); + } + + return error.HomeNotFound; +} + pub fn getBinHome(allocator: Allocator) ![]u8 { if (std.os.getenv("HOME")) |home| { return std.fs.path.join(allocator, &.{ home, ".local", "bin" }); @@ -23,6 +36,36 @@ pub fn getBinHome(allocator: Allocator) ![]u8 { return error.HomeNotFound; } +pub fn getConfigDirs(allocator: Allocator, app_name: []const u8) ![][]u8 { + var list = ArrayList([]u8).init(allocator); + errdefer for (list.items) |s| allocator.free(s); + defer list.deinit(); + + if (std.os.getenv("XDG_CONFIG_DIRS")) |config_dirs| { + var it = std.mem.split(u8, config_dirs, ":"); + while (it.next()) |config_dir| { + try list.append(try std.fs.path.join(allocator, &.{ config_dir, app_name })); + } + } else { + try list.append(try std.fs.path.join(allocator, &.{ "/etc/xdg", app_name })); + } + + return list.toOwnedSlice(); +} + +pub fn getAllConfigDirs(allocator: Allocator, app_name: []const u8) ![][]u8 { + var list = ArrayList([]u8).init(allocator); + errdefer for (list.items) |s| allocator.free(s); + defer list.deinit(); + + try list.append(try getConfigHome(allocator, app_name)); + const config_dirs = try getConfigDirs(allocator, app_name); + defer allocator.free(config_dirs); + try list.appendSlice(config_dirs); + + return list.toOwnedSlice(); +} + pub fn openDataHome(allocator: Allocator, app_name: []const u8) !Dir { var data_home = try getDataHome(allocator, app_name); defer allocator.free(data_home); -- cgit v1.2.3