package Config::ClawsMail; use v5.26; use Moo; # VERSION use experimental 'signatures'; use Config::ClawsMail::Account; use Config::ClawsMail::PasswordStore; use Config::ClawsMail::MainConfigParser; use Config::ClawsMail::PasswordStoreParser; use Types::Standard qw(HashRef InstanceOf); use Types::Path::Tiny qw(Path); use namespace::clean; # ABSTRACT: Claws-Mail config parser has basedir => ( is => 'ro', isa => Path, coerce => 1, default => '~/.claws-mail', ); has master_password => ( is => 'ro' ); has main_config => ( is => 'lazy', isa => HashRef, ); sub _build_main_config($self) { Config::ClawsMail::MainConfigParser->read_file($self->basedir->child('clawsrc')); } has password_store => ( is => 'lazy', isa => InstanceOf['Config::ClawsMail::PasswordStore'], ); sub _build_password_store($self) { my $raw_data = Config::ClawsMail::PasswordStoreParser->read_file( $self->basedir->child('passwordstorerc'), ); Config::ClawsMail::PasswordStore->new({ raw_data => $raw_data, master_password => $self->master_password, master_salt_bs64 => $self->main_config->{Common}{master_passphrase_salt}, }); } has accounts => ( is => 'lazy', isa => HashRef[InstanceOf['Config::ClawsMail::Account']], ); sub _build_accounts($self) { my $raw_accounts = Config::INI::Reader->read_file( $self->basedir->child('accountrc'), ); my %accounts; for my $account_id (keys $raw_accounts->%*) { my $account = Config::ClawsMail::Account->new_from_config({ account_section => $account_id, account_config => $raw_accounts->{$account_id}, password_store => $self->password_store, }) or next; $accounts{ $account->account_name } = $account; } return \%accounts; } 1;