package System::Introspector::MountPoints;
use Moo;

use System::Introspector::Util qw(
    handle_from_file
    transform_exceptions
);

sub gather {
    my ($self) = @_;
    return {
        mtab => transform_exceptions {
            return { entries
                => $self->_parse_tab_fh($self->_open_fh('/etc/mtab')) };
        },
        fstab => transform_exceptions {
            return { entries
                => $self->_parse_tab_fh($self->_open_fh('/etc/fstab')) };
        },
    };
}

sub _open_fh {
    my ($self, $file) = @_;
    return handle_from_file $file;
}

sub _parse_tab_fh {
    my ($self, $fh) = @_;
    my @mounts;
    while (defined( my $line = <$fh> )) {
        chomp $line;
        next if $line =~ m{^\s*$}
             or $line =~ m{^\s*#};
        my ($device, $point, $type, $opt, $dump, $pass)
            = split m{\s+}, $line;
        push @mounts, {
            device_name => $device,
            mount_point => $point,
            fs_type     => $type,
            dump_freq   => $dump,
            pass_num    => $pass,
            options     => {
                map {
                    my ($name, $value) = split m{=}, $_, 2;
                    $value = 1
                        unless defined $value;
                    ($name => $value);
                } split m{,}, $opt,
            },
        };
    }
    no warnings 'uninitialized';
    return [ sort {
        ($a->{device_name} cmp $b->{device_name})
        ||
        ($a->{mount_point} cmp $b->{mount_point})
    } @mounts ];
}

1;

__END__

=head1 NAME

System::Introspector::MountPoints - Gather moint point information

=head1 DESCRIPTION

Reads C<fstab> and C<mtab> files to provide mount point information.

=head1 SEE ALSO

=over

=item L<System::Introspector>

=back

=cut

