Как я могу лучше обрабатывать файлы конфигурации? - PullRequest
7 голосов
/ 27 мая 2019

В пакете, который я пишу, у меня есть модуль конфигурации, который выглядит следующим образом:

use v6.d;
use JSON::Fast;
use PSBot::Tools;

sub EXPORT(--> Hash) {
    my Str $path = do if %*ENV<TESTING> {
        $*REPO.Str.IO.child('META6.json').e
            ?? $*REPO.Str.IO.child('t/config.json').Str         # For when testing using zef
            !! $*REPO.Str.IO.parent.child('t/config.json').Str; # For when testing using prove
    } elsif $*DISTRO.is-win {
        "%*ENV<LOCALAPPDATA>\\PSBot\\config.json"
    } else {
        "$*HOME/.config/PSBot/config.json"
    };

    unless $path.IO.e {
        note "PSBot config at $path does not exist!";
        note "Copy psbot.json.example there and read the README for instructions on how to set up the config file.";
        exit 1;
    }

    with from-json slurp $path -> %config {
        %(
            USERNAME               => %config<username>,
            PASSWORD               => %config<password>,
            AVATAR                 => %config<avatar>,
            HOST                   => %config<host>,
            PORT                   => %config<port>,
            SERVERID               => %config<serverid>,
            COMMAND                => %config<command>,
            ROOMS                  => set(%config<rooms>.map: &to-roomid),
            ADMINS                 => set(%config<admins>.map: &to-id),
            MAX_RECONNECT_ATTEMPTS => %config<max_reconnect_attempts>,
            GIT                    => %config<git>,
            DICTIONARY_API_ID      => %config<dictionary_api_id>,
            DICTIONARY_API_KEY     => %config<dictionary_api_key>,
            YOUTUBE_API_KEY        => %config<youtube_api_key>,
            TRANSLATE_API_KEY      => %config<translate_api_key>
        )
    }
}

Каждый раз, когда я делаю изменения в файле конфигурации, я должен удалить файлы precomp для измененийпоявляться.Есть ли способ, которым я могу написать это, чтобы экспорт не был определен во время компиляции, чтобы пользователи не должны были это делать?

Ответы [ 2 ]

4 голосов
/ 27 мая 2019

Если я правильно понимаю ваши намерения, один из способов сделать это будет следующим:

  1. избавиться от EXPORT sub
  2. поместить вычисление $path и%config в основную линию модуля
  3. объявите ваши «константы» в качестве таких терминов, как

    sub term:<USERNAME> is export { %config<username> }
    
0 голосов
/ 05 июня 2019

После прочтения комментариев ваших ребят и ответа @Christoph я остановился на этом.Это делает то, что я хочу сделать:

use v6.d;
use JSON::Fast;
use PSBot::Tools;
unit module PSBot::Config;

my Str $path = do if %*ENV<TESTING> {
    %?RESOURCES<test/config.json>.Str
} elsif $*DISTRO.is-win {
    Qh[%*ENV<LOCALAPPDATA>\PSBot\config.json]
} else {
    "$*HOME/.config/PSBot/config.json"
};

unless $path.IO.e {
    note "PSBot config at $path does not exist!";
    note "Copy config.json.example there and read the README for instructions on how to set up the config file.";
    exit 1;
}

my %config = from-json slurp $path;

sub term:<USERNAME>               is export  { %config<username>                   }
sub term:<PASSWORD>               is export  { %config<password>                   }
sub term:<AVATAR>                 is export  { %config<avatar>                     }
sub term:<HOST>                   is export  { %config<host>                       }
sub term:<PORT>                   is export  { %config<port>                       }
sub term:<SERVERID>               is export  { %config<serverid>                   }
sub term:<COMMAND>                is export  { %config<command>                    }
sub term:<ROOMS>                  is export  { set(%config<rooms>.map: &to-roomid) }
sub term:<ADMINS>                 is export  { set(%config<admins>.map: &to-id)    }
sub term:<MAX_RECONNECT_ATTEMPTS> is export  { %config<max_reconnect_attempts>     }
sub term:<GIT>                    is export  { %config<git>                        }
sub term:<DICTIONARY_API_ID>      is export  { %config<dictionary_api_id>          }
sub term:<DICTIONARY_API_KEY>     is export  { %config<dictionary_api_key>         }
sub term:<YOUTUBE_API_KEY>        is export  { %config<youtube_api_key>            }
sub term:<TRANSLATE_API_KEY>      is export  { %config<translate_api_key>          }
...