mirror of
https://github.com/gyoder/dots.git
synced 2026-02-27 17:03:45 +00:00
91 lines
2.8 KiB
Fish
91 lines
2.8 KiB
Fish
function loadenv
|
|
argparse h/help print printb U/unload -- $argv
|
|
or return 1
|
|
|
|
if set -q _flag_help
|
|
echo "Usage: loadenv [OPTIONS] [FILE]"
|
|
echo ""
|
|
echo "Export keys and values from a dotenv file."
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --help, -h Show this help message"
|
|
echo " --print Print env keys (export preview)"
|
|
echo " --printb Print keys with surrounding brackets"
|
|
echo " --unload, -U Unexport all keys defined in the dotenv file"
|
|
echo ""
|
|
echo "Arguments:"
|
|
echo " FILE Path to dotenv file (default: .env)"
|
|
return 0
|
|
end
|
|
|
|
if test (count $argv) -gt 1
|
|
echo "Too many arguments. Only one argument is allowed. Use --help for more information."
|
|
return 1
|
|
end
|
|
|
|
set -l dotenv_file ".env"
|
|
if test (count $argv) -eq 1
|
|
set dotenv_file $argv[1]
|
|
end
|
|
|
|
if not test -f $dotenv_file
|
|
echo "Error: File '$dotenv_file' not found in the current directory."
|
|
return 1
|
|
end
|
|
|
|
set -l mode load
|
|
if set -q _flag_print
|
|
set mode print
|
|
else if set -q _flag_printb
|
|
set mode printb
|
|
else if set -q _flag_unload
|
|
set mode unload
|
|
end
|
|
|
|
set lineNumber 0
|
|
|
|
for line in (cat $dotenv_file)
|
|
set lineNumber (math $lineNumber + 1)
|
|
|
|
# Skip empty lines and comment lines
|
|
if string match -qr '^\s*$|^\s*#' $line
|
|
continue
|
|
end
|
|
|
|
if not string match -qr '^[A-Za-z_][A-Za-z0-9_]*=' $line
|
|
echo "Error: invalid declaration (line $lineNumber): $line"
|
|
return 1
|
|
end
|
|
|
|
# Parse key and value
|
|
set -l key (string split -m 1 '=' $line)[1]
|
|
set -l after_equals_sign (string split -m 1 '=' $line)[2]
|
|
|
|
set -l value
|
|
set -l double_quoted_value_regex '^"(.*)"\s*(?:#.*)*$'
|
|
set -l single_quoted_value_regex '^\'(.*)\'\s*(?:#.*)*$'
|
|
set -l plain_value_regex '^([^\'"\s]*)\s*(?:#.*)*$'
|
|
if string match -qgr $double_quoted_value_regex $after_equals_sign
|
|
set value (string match -gr $double_quoted_value_regex $after_equals_sign)
|
|
else if string match -qgr $single_quoted_value_regex $after_equals_sign
|
|
set value (string match -gr $single_quoted_value_regex $after_equals_sign)
|
|
else if string match -qgr $plain_value_regex $after_equals_sign
|
|
set value (string match -gr $plain_value_regex $after_equals_sign)
|
|
else
|
|
echo "Error: invalid value (line $lineNumber): $line"
|
|
return 1
|
|
end
|
|
|
|
switch $mode
|
|
case print
|
|
echo "$key=$value"
|
|
case printb
|
|
echo "[$key=$value]"
|
|
case load
|
|
set -gx $key $value
|
|
case unload
|
|
set -e $key
|
|
end
|
|
end
|
|
|
|
end
|