The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

YAML::PP::Schema::Env - schema for serializing environment variables in YAML files

SYNOPSIS

    use YAML::PP;
    my $yp = YAML::PP->new( schema => [qw/ + Env /] );
    $ENV{MY_SECRET_PASSWORD} = 's3cr37!';
    my $password = $yp->load_string('--- !ENV ${MY_SECRET_PASSWORD}');
    print $password, "\n"; # output is: s3cr37!

DESCRIPTION

This schema allows interpolation of environment variables when loading YAML files. For this, the tag !ENV is used. Any following substring matching the ${ENVIRONMENT_VARIABLE} pattern is replaced by the current environment variable value, or throws an exception if there's no such environment variable.

It's possible to specify a default value within ${...}, by default separated with a colon. If there's a default value then an environment variable does not need to exist.

This module was influenced by https://pypi.org/project/pyaml-env/, but some things are differently handled here, most notably that missing environment variables cause exceptions by default.

CONFIGURATION

The following options are recognized when initializing the schema:

defval

A global default value which is used if the environment variable does not exist and there's no local default value set. Examples:

    YAML::PP->new(schema => [qw(+ Env defval=)]); # the empty string
    YAML::PP->new(schema => [qw(+ Env defval=N/A)]);
defsep

Another separator than the default :. Examples:

    YAML::PP->new(schema => [qw(+ Env defsep=!)]);
    YAML::PP->new(schema => [qw(+ Env defsep=*)]);

EXAMPLES

Here's a sample YAML file with various replacements:

    ---
    # no replacement in the next line:
    noenv:        noenv

    # replace the environment variable SIMPLE, or throw an exception if it's not defined:
    simple:       !ENV ${SIMPLE}

    # replace two environment variables (ENV1 and ENV2), and may throw an exception:
    concat:       !ENV before ${ENV1} middle ${ENV2} after

    # replace the environment variable DEFAULT_TEST, or use "this is the default value" if it does not exist:
    with_default: !ENV ${DEFAULT_TEST:this is the default value}

If the YAML::PP parser was created with

    YAML::PP->new(schema => [qw(+ Env defsep=! defval=N/A)]);

then a YAML file

    ---
    env_not_exist1: !ENV ${DOES_NOT_EXIST1}
    env_not_exist2: !ENV ${DOES_NOT_EXIST2!default value}

would yield the same as the following (if both used environment variables do not exist):

    ---
    env_not_exist1: N/A
    env_not_exist2: default value

AUTHOR

Slaven Rezic <srezic@cpan.org>

SEE ALSO

YAML::PP, https://pypi.org/project/pyaml-env/.