meta/rpc/SAI/Attrs/Attribute.pm (79 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::Attrs::Attribute; use namespace::autoclean; use Moose; has 'type' => ( is => 'rw', isa => 'SAI::Type', required => 1, coerce => 1 ); has 'flags' => ( is => 'rw', isa => 'Str', required => 1 ); has 'get' => ( is => 'rw', isa => 'Bool', default => 1 ); has 'set' => ( is => 'rw', isa => 'Bool', lazy => 1, default => sub { shift->flags =~ /SET/ }, ); has 'create' => ( is => 'rw', isa => 'Bool', lazy => 1, default => sub { shift->flags =~ /CREATE/ }, ); has 'mandatory' => ( is => 'rw', isa => 'Bool', lazy => 1, default => sub { shift->flags =~ /MANDATORY/ }, ); # The name of field in sai_attribute_value_t has 'typename' => ( is => 'rw', isa => 'Str' ); extends 'SAI::Enum::Element'; ########### # Methods # ########### ################ # TT coditions # ################ ################ # Construction # ################ sub _get_flags_and_type { my $class = shift; my $xml_typedef = $_[0]; my $flags; my $type; # Iterate over the hash to find flags and type for ( @{ $xml_typedef->{simplesect} } ) { next unless defined $_->{title}; $flags = $_->{para}[0] if ( $_->{title}[0] eq 'Flags:' ); if ( $_->{title}[0] eq 'Value Type:' ) { $type = $1 if $_->{para}[0] =~ /\@type\s*(\w+)/; } last if defined $type and defined $flags; } $type =~ s/\@type\s*(\w+)//g if defined $type; return ( $flags, $type ); } around parse_xml_typedef => sub { my $orig = shift; my $class = shift; my $xml_typedef = $_[0]; my $flags; my $type; for ( @{ $xml_typedef->{detaileddescription}[0]->{para} } ) { next unless $class->_validate_xml_enum_description($_); ( $flags, $type ) = $class->_get_flags_and_type($_); last if defined $type and defined $flags; } return ( type => $type, flags => $flags, $class->$orig(@_) ); }; # Validate enum descrtiption from XML sub _validate_xml_enum_description { my $class = shift; my $desc = shift; return 1 if ref $desc eq 'HASH'; return 0; } around validate_xml_typedef => sub { my $orig = shift; my $class = shift; my $xml_typedef = $_[0]; my $flags; my $type; return 0 unless $class->$orig(@_); for ( @{ $xml_typedef->{detaileddescription}[0]->{para} } ) { next unless $class->_validate_xml_enum_description($_); ( $flags, $type ) = $class->_get_flags_and_type($_); last if defined $type and defined $flags; } return 0 unless defined $type and defined $flags; return 1; }; __PACKAGE__->meta->make_immutable; 1;