Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

#
# (c) Jan Gehring <jan.gehring@gmail.com>
#
package Rex::Notify;
use v5.12.5;
our $VERSION = '1.16.0'; # VERSION
sub new {
my $that = shift;
my $proto = ref($that) || $that;
my $self = {@_};
bless( $self, $proto );
$self->{__types__} = {};
$self->{__postponed__} = [];
$self->{__running_postponed__} = 0;
$self->{__in_notify__} = 0;
return $self;
}
sub add {
my ( $self, %option ) = @_;
return if ( $self->{__in_notify__} );
if ( exists $self->{__types__}->{ $option{type} }->{ $option{name} } ) {
Rex::Logger::debug(
"A resource of the type $option{type} and name $option{name}"
. "already exists.",
"warn"
);
return;
}
$self->{__types__}->{ $option{type} }->{ $option{name} } = {
postpone => $option{postpone} || 0,
options => $option{options},
cb => $option{cb},
};
}
sub run {
my ( $self, %option ) = @_;
Rex::Logger::debug("Try to notify $option{type} -> $option{name}");
if ( exists $self->{__types__}->{ $option{type} }
&& exists $self->{__types__}->{ $option{type} }->{ $option{name} }
&& exists $self->{__types__}->{ $option{type} }->{ $option{name} }->{cb}
&& $self->{__types__}->{ $option{type} }->{ $option{name} }->{postpone} ==
0 )
{
Rex::Logger::debug("Running notify $option{type} -> $option{name}");
my $cb = $self->{__types__}->{ $option{type} }->{ $option{name} }->{cb};
$self->{__in_notify__} = 1;
$cb->(
$self->{__types__}->{ $option{type} }->{ $option{name} }->{options} );
$self->{__in_notify__} = 0;
}
else {
if ( !$self->{__running_postponed__} ) {
Rex::Logger::debug(
"Can't notify $option{type} -> $option{name}. Postponing...");
$self->_postpone(%option);
}
else {
Rex::Logger::info(
"Can't run postponed notification. "
. "Resource not found ($option{type} -> $option{name})",
"warn"
);
}
}
}
sub run_postponed {
my ($self) = @_;
$self->{__running_postponed__} = 1;
Rex::Logger::debug("Running postponed notifications.");
for my $p ( @{ $self->{__postponed__} } ) {
$self->run( %{$p} );
}
}
sub _postpone {
my ( $self, %option ) = @_;
push @{ $self->{__postponed__} }, \%option;
}
1;