meta/rpc/SAI/Type.pm (109 lines of code) (raw):
# Copyright 2021-present Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
package SAI::Type;
use namespace::autoclean;
use Moose::Util::TypeConstraints;
use Term::ANSIColor;
use Carp;
use Moose;
subtype 'SAI::Types::TypeName' => as 'Str' => where { /\S\w+/ };
# Accept also Str (TypeName) as Type
coerce 'SAI::Type' => from 'SAI::Types::TypeName' =>
via { SAI::Type->new( name => $_ ) };
# The type has a name, and additional type information.
has 'name' => (
is => 'ro',
isa => 'SAI::Types::TypeName',
required => 1,
writer => '_set_name',
);
has 'ptr' => ( is => 'rw', isa => 'Int', default => 0 );
has 'array' => ( is => 'ro', isa => 'Int', default => 0 );
has 'subtype' => (
is => 'rw',
isa => 'SAI::Type',
coerce => 1,
trigger => \&_subtype_set,
);
with 'SAI::RPC::Type', 'SAI::RPC::ThriftName::Type', 'SAI::Utils::XMLLoader';
###########
# Methods #
###########
# The simplified name of a type
sub short_name {
my $self = shift;
my $short_name;
if ( $self->is_list ) {
$short_name = $self->subtype->name;
}
else {
$short_name = $self->name;
}
$short_name =~ s/sai_//g;
$short_name = $1 if $short_name =~ /^(\w+)_t$/;
$short_name = 'buffer' if $short_name =~ /void/ and $self->ptr;
$short_name .= '_list' if $self->is_list;
return $short_name;
}
sub is_list {
my $self = shift;
return 1 if ( $self->array or $self->ptr ) and $self->subtype;
return 0;
}
sub is_attr {
my $self = shift;
return 1 if $self->name =~ /attribute/;
return 0;
}
sub _subtype_set {
my $self = shift;
my $subtype = shift;
if ( $self->ptr ) {
$self->_set_name( 'PTR=>' . $subtype->name );
}
elsif ( $self->array ) {
$self->_set_name( 'ARRAY=>' . $subtype->name );
}
else {
croak 'Cannot set subtype for '
. $self->name
. ' - it is neither pointer nor array';
}
return;
}
sub convert_to_list {
my $self = shift;
if ( $self->ptr ) {
$self->subtype( $self->name );
}
else {
croak $self->name . ': only pointer can be converted to the list';
}
return;
}
################
# TT coditions #
################
################
# Construction #
################
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;
my %args = @_;
my $ptr = 0;
my $array = 0;
# Check if we have a pointer or array
if ( $args{name} ) {
$args{name} =~ s/(const )|( const)//g;
$ptr = $args{name} =~ s/[*]//g unless $args{ptr};
$array = $1 if $args{name} =~ s/\[(\d+)\]//g and not $args{array};
if ($ptr) {
$args{ptr} = $ptr;
}
if ($array) {
$args{subtype} = $args{name};
$args{array} = $array;
}
return $class->$orig(%args);
}
return $class->$orig(@_);
};
sub parse_xml_typedef {
my $class = shift;
my $xml_typedef = shift;
my $name = $xml_typedef->{name}[0];
return ( name => $name );
}
sub validate_xml_typedef {
my $class = shift;
my $xml_typedef = shift;
return 1;
}
__PACKAGE__->meta->make_immutable;
1;