Image-DS9

 view release on metacpan or  search on metacpan

lib/Image/DS9/PConsts.pm  view on Meta::CPAN

package Image::DS9::PConsts;

# ABSTRACT: Internal Constants

use v5.10;

use strict;
use warnings;
use overload ();

use Data::Visitor::Tiny ();
use Ref::Util qw( is_regexpref is_coderef is_blessed_ref is_ref is_arrayref is_refref is_scalarref);
use Scalar::Util 'reftype';

our $VERSION = 'v1.0.1';

use Types::TypeTiny 'is_StringLike';

use Image::DS9::Util 'is_TODO';

use Image::DS9::Constants::V1
  'COLORS',
  'FRAME_COORD_SYSTEMS',
  'FRAME_COORD_SYSTEMS_NON_WCS',
  'SKY_COORD_SYSTEMS',
  'ANGULAR_UNITS',
  'ANGULAR_FORMATS',
  'WCS';

use parent 'Exporter';
use Safe::Isa;

## no critic (Modules::ProhibitAutomaticExportation)
our @EXPORT = qw(
  %TypeCvt

  T_ANGLE_UNIT
  T_ARRAY
  T_BOOL
  T_COLOR
  T_COORD
  T_COORDSYS
  T_COORDSYS_NON_WCS
  T_EPHEMERAL
  T_FALSE
  T_FLOAT
  T_HASH
  T_INT
  T_JPEG_FILE
  T_OTHER
  T_PDL
  T_REWRITE
  T_SEXAGESIMAL_DEC
  T_SEXAGESIMAL_RA
  T_SKYFORMAT
  T_SKYFRAME
  T_STRING
  T_STRING_NL
  T_STRING_QUOTE
  T_STRING_STRIP
  T_TIFF_FILE
  T_WCSS
  T_WCS_ARRAY
  T_WCS_HASH
  T_WCS_SCALARREF

  ANGLE_UNIT
  BOOL
  BOOL_FALSE
  COLOR
  COORDSYS
  COORDSYS_NON_WCS

lib/Image/DS9/PConsts.pm  view on Meta::CPAN

our $FALSE;

BEGIN {

    $FLOAT           = qr/[+-]?(?:\d+[.]?\d*|[.]\d+)(?:[eE][+-]?\d+)?/;
    $SEXAGESIMAL_DEC = qr/[+-]?\d{2}:\d{2}:\d{2}(?:.\d+)?/;
    $SEXAGESIMAL_RA  = qr/\d{2}:\d{2}:\d{2}(?:.\d+)?/;

    $TRUE  = qr/1|yes|true/i;
    $FALSE = qr/0|no|false/i;
}


use enum qw( CvtSet CvtGet );

# mustn't be 0
use enum (
    ':T_=1',
    'ANGLE_UNIT',
    'ARRAY',
    'BOOL',
    'COLOR',
    'COORD',
    'COORDSYS',
    'COORDSYS_NON_WCS',
    'EPHEMERAL',
    'FALSE',
    'FLOAT',
    'HASH',
    'INT',
    'JPEG_FILE',
    'OTHER',
    'PDL',
    'REWRITE',
    'SCALARREF',
    'SEXAGESIMAL_DEC',
    'SEXAGESIMAL_RA',
    'SKYFORMAT',
    'SKYFRAME',
    'STRING',
    'STRING_NL',       # trailing \n added on output if necessary
    'STRING_QUOTE',    # wrap string with quote chars
    'STRING_STRIP',    # strip blanks from string on set
    'TIFF_FILE',
    'WCSARRAY',
    'WCSHASH',
    'WCSS',
    'WCS_SCALARREF',
);

## no critic (Modules::ProhibitMultiplePackages)
## no critic (ClassHierarchies::ProhibitExplicitISA)

# These should be split out, but at the moment they require constants
# from Pconsts, and the tokens are defined in Pconsts, so there's a
# circular import loop.

{
    package    #
      Image::DS9::Parser::Token;
    use Ref::Util ();
    sub new {
        my ( $class, %fields ) = @_;

        unless ( Ref::Util::is_ref( $fields{check} ) ) {
            my $check = $fields{check};
            $fields{check} = sub { $_[0] eq $check ? \$_[0] : undef };
        }
        return bless \%fields, $class;
    }
    sub check {
        $_[0]{check}->( $_[1] );
    }

    sub extra { $_[0]{extra} }
    sub name  { $_[0]{name} }
    sub tag   { $_[0]{tag} }
    sub value { $_[0]{value} }
    sub desc  { $_[0]{desc} }

    sub to_string {
        my $self = shift;
        die sprintf( q{%s (%s) didn't implement 'to_string'}, Scalar::Util::blessed( $self ), $self->name );
    }

    sub is_ephemeral { $_[0]{tag} eq Image::DS9::PConsts::T_EPHEMERAL }
    sub is_rewrite   { $_[0]{tag} eq Image::DS9::PConsts::T_REWRITE }


    sub cvt_from_get {
        my $self = shift;
        die unless @_;

        my $valref = shift;
        return Image::DS9::PConsts::type_cvt( Image::DS9::PConsts::CvtGet, $self->tag, $valref );
    }

    sub cvt_for_set {
        my $self = shift;
        die unless @_;

        my $valref = shift;
        return Image::DS9::PConsts::type_cvt( Image::DS9::PConsts::CvtSet, $self->tag, $valref );
    }

    sub _arg_names {
        return ( 'name', 'value', 'tag', 'desc' );
    }


    sub _extract_args {
        my ( $class, $args ) = @_;

        my %args = map { $_ => delete $args->{$_} } $class->_arg_names;

        if ( keys %$args ) {
            require Data::Dump;
            die(
                sprintf(
                    q{%s doesn't support extra args: %s\n%s},
                    $class,
                    Data::Dump::pp( [%$args] ),
                    Data::Dump::pp( [ \%args ] ),
                ) );
        }

        my @missing = grep !exists $args{$_}, keys %args;
        die( 'missing args: ' . join( ', ', @missing ) ) if @missing;

        return %args;
    }

}


{
    package    #
      Image::DS9::Parser::Token::Enum;

    our @ISA = ( 'Image::DS9::Parser::Token' );

    sub new {
        my ( $class, %args ) = @_;

        $args{name} //= 'ENUM';
        %args = $class->_extract_args( \%args );

        die( 'value must be an arrayref' ) unless Ref::Util::is_arrayref( $args{value} );

        my $check = join( q{|}, q{}, ( map { lc $_ } @{ $args{value} } ), q{} );

        return $class->SUPER::new(
            %args,
            check => sub {
                index( $check, q{|} . lc( $_[0] ) . q{|} ) > -1 ? \$_[0] : undef;
            },
        );
    }

    sub to_string {
        my $self = shift;
        return '( ' . join( ' | ', map { "'$_'" } sort @{ $self->value } ) . ' )';
    }

}

{
    package    #
      Image::DS9::Parser::Token::Regexp;

    our @ISA = ( 'Image::DS9::Parser::Token' );

    sub new {
        my ( $class, %args ) = @_;

        %args = $class->_extract_args( \%args );
        my $qr = delete $args{value};

        $qr = qr/^(?:$qr)$/;

        return $class->SUPER::new(
            %args,
            value => $qr,
            check => sub { $_[0] =~ $qr ? \$_[0] : undef },
        );

    }

    sub to_string {
        my $self = shift;
        return q{} . $self->value;
    }

}

{
    package    #
      Image::DS9::Parser::Token::Constant;

    our @ISA = ( 'Image::DS9::Parser::Token' );

    sub new {
        my ( $class, %args ) = @_;

        %args = $class->_extract_args( \%args );

        my $constant = $args{value};
        return $class->SUPER::new( %args, check => sub { $_[0] eq $constant ? \$_[0] : undef }, );



( run in 1.048 second using v1.01-cache-2.11-cpan-39bf76dae61 )