logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Parse::Binary::FixedFormat::Variants - Convert between variant records and hashes

Attributes

       Each Parse::Binary::FixedFormat::Variants instance contains the following attributes.

       Layouts
           Contains an array of Parse::Binary::FixedFormat objects.  Each of these objects  is  responsible  for
           converting a single record format variant.

       Chooser
           This attribute contains the function that chooses which variant to apply to the record.

Authors

       Audrey Tang <cpan@audreyt.org>

       Based     on     Data::FixedFormat::Variants,     written     by     Thomas    Pfau    <pfau@nbpfaus.net>
       http://nbpfaus.net/~pfau/.

Description

Parse::Binary::FixedFormat supports variant record formats.  To describe a variant structure, pass a hash
       reference containing the following elements to new.  The object returned to handle variant records will
       be a Parse::Binary::FixedFormat::Variants.

       Chooser
           When converting a buffer to a hash, this subroutine is invoked after applying the first format to the
           buffer.   The  generated  hash reference is passed to this routine.  Any field names specified in the
           first format are available to be used in making a decision on which format to  use  to  decipher  the
           buffer.  This routine should return the index of the proper format specification.

           When  converting  a  hash  to  a buffer, this subroutine is invoked first to choose a packing format.
           Since the same function is used for both conversions, this function should restrict itself  to  field
           names that exist in format 0 and those fields should exist in the same place in all formats.

       Formats
           This is a reference to a list of formats.  Each format contains a list of field specifications.

       For example:

           my $cvt = new Parse::Binary::FixedFormat {
               Chooser => sub { my $rec=shift;
                                $rec->{RecordType} eq '0' ? 1 : 2
                              },
               Formats => [ [ 'RecordType:A1' ],
                            [ 'RecordType:A1', 'FieldA:A6', 'FieldB:A4:4' ],
                            [ 'RecordType:A1', 'FieldC:A4', 'FieldD:A18' ] ]
               };
           my $rec0 = $cvt->unformat("0FieldAB[0]B[1]B[2]B[3]");
           my $rec1 = $cvt->unformat("1FldC<-----FieldD----->");

       In  the  above  example,  the  "Chooser" function looks at the contents of the "RecordType" field.  If it
       contains a '0', format 1 is used.  Otherwise, format 2 is used.

       Parse::Binary::FixedFormat::Variants can be  used  is  if  it  were  a  Parse::Binary::FixedFormat.   The
       "format"  and  "unformat"  methods will determine which variant to use automatically.  The "blank" method
       requires an argument that specifies the variant number.

Name

       Parse::Binary::FixedFormat::Variants - Convert between variant records and hashes