Absolute hinky bare-bones implementation of multiformats in Perl
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

sort of initial

+127 -2
+32
.gitlab-ci.yml
··· 1 + stages: 2 + - test-distribution 3 + - build-distribution 4 + - release-distribution 5 + 6 + dzil-test: 7 + stage: test-distribution 8 + image: $CI_REGISTRY/blockstackers/perl-mojolicious:latest 9 + script: 10 + - dzil listdeps --missing|cpanm -n 11 + - dzil test 12 + rules: 13 + - if: $CI_COMMIT_BRANCH =~ /^f-.*$/ || $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_PIPELINE_SOURCE == 'merge_request_event' 14 + 15 + dzil-build: 16 + stage: build-distribution 17 + image: $CI_REGISTRY/blockstackers/perl-mojolicious:latest 18 + dependencies: 19 + - dzil-test 20 + script: 21 + - dzil build 22 + - APP_VER=`cat package-version.txt` 23 + - echo "Releasing $APP_VER" 24 + - git tag "$APP_VER" 25 + - git push --tags https://root:$GIT_TOKEN@gitlab.blockstackers.net/$CI_PROJECT_PATH.git HEAD:main 26 + - curl -u token:${WOK_TOKEN} -F "author=MADCAT" -F "dist=@Multiformats-${APP_VER}.tar.gz" https://wok.blockstackers.net/upload 27 + # FIXME FIXME: push to PAUSE; we're not using dzil release because reasons 28 + # - echo "user $PAUSE_USER" > pause.cfg 29 + # - echo "password $PAUSE_PASSWORD >> pause.cfg" 30 + # - cpan-upload --config pause.cfg Multiformats-${APP_VER}.tar.gz 31 + rules: 32 + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-1
dist.ini
··· 21 21 [AutoPrereqs] 22 22 23 23 [Prereqs] 24 - Math::Base36 = 0
+54
lib/Multiformats/Multibase.pm
··· 1 + package 2 + Multiformats::Multibase { 3 + use strict; 4 + use warnings; 5 + use feature 'signatures'; 6 + 7 + use Exporter 'import'; 8 + our @EXPORT_OK = qw/multibase_encode multibase_decode/; 9 + 10 + use Crypt::Misc qw/encode_b58b decode_b58b encode_b32r decode_b32r/; 11 + use Math::Base36 qw/encode_base36 decode_base36/; 12 + 13 + sub decode($self, $value) { 14 + return multibase_decode($value); 15 + } 16 + 17 + sub encode($self, $as, $value) { 18 + return multibase_encode($as, $value); 19 + } 20 + 21 + sub new($pkg) { 22 + return bless({}, $pkg); 23 + } 24 + 25 + # these 2 maps map the actual encoding and decoding 26 + # to a subroutine that takes the to be decoded/encoded values as first argument 27 + # please note that only a few formats are implemented by default 28 + use constant MB_ENCODE_MAP => { 29 + 'none' => sub { return "\0" . shift }, 30 + 'base32' => sub { return 'b' . encode_b32r(shift) }, 31 + 'base36' => sub { return 'k' . encode_base36(shift) }, 32 + 'base58btc' => sub { return 'z' . encode_b58b(shift) }, 33 + }; 34 + 35 + use constant MB_DECODE_MAP => { 36 + "\0" => sub { return shift }, 37 + 'b' => sub { return decode_b32r(shift) }, 38 + 'k' => sub { return decode_base36(shift) }, 39 + 'z' => sub { return decode_b58b(shift) }, 40 + }; 41 + 42 + sub multibase_decode($bytes) { 43 + my $t = substr($bytes, 0, 1); 44 + die 'unknown format ' . $t . ', ' unless exists MB_DECODE_MAP->{$t}; 45 + return MB_DECODE_MAP->{$t}->(substr($bytes, 1)); 46 + } 47 + 48 + sub multibase_encode($as, $bytes) { 49 + die 'unknown format ' . $as . ', ' unless exists MB_ENCODE_MAP->{$as}; 50 + return MB_ENCODE_MAP->{$as}->($bytes); 51 + } 52 + } 53 + 54 + 1;
+1 -1
lib/Multiformats/Varint.pm
··· 16 16 } 17 17 18 18 sub encode($self, $value) { 19 - return encode_varint($value); 19 + return varint_encode($value); 20 20 } 21 21 22 22 sub new($pkg) {
+27
t/001_varint.t
··· 1 + use Test::More; 2 + 3 + use Multiformats::Varint qw/varint_encode varint_decode_raw varint_decode/; 4 + 5 + my $object = Multiformats::Varint->new; 6 + 7 + is(varint_encode(300), "\xAC\x02", 'non-wantarray encoding works'); 8 + 9 + my @o = varint_encode(300); 10 + 11 + is($o[0], "\xAC\x02", 'wantarray encoding works'); 12 + is($o[1], 2, 'wantarray encoding returns proper bytes used'); 13 + 14 + is(varint_decode(pack('C*', 172, 2)), 300, 'non-wantarray decoding works'); 15 + 16 + my @d = varint_decode_raw(pack('C*', 172, 2)); 17 + 18 + is($d[0], 300, 'wantarray decoding works'); 19 + is($d[1], 2, 'wantarray decoding returns proper bytes used'); 20 + 21 + my $e = varint_encode(8675309); 22 + is(varint_decode($e), 8675309, 'decoding encoded value works'); 23 + 24 + is($object->encode(300), "\xAC\x02", "OO encoding works"); 25 + is($object->decode_raw("\xAC\x02"), 300, "OO decoding works"); 26 + 27 + done_testing();
+13
t/002_multibase.t
··· 1 + use Test::More; 2 + 3 + use Multiformats::Multibase qw/multibase_encode multibase_decode/; 4 + 5 + my $object = Multiformats::Multibase->new; 6 + 7 + is(multibase_encode('base58btc', 'yes mani !'), 'z7paNL19xttacUY', 'imported encode: b58btc encodes properly'); 8 + is(multibase_decode('z7paNL19xttacUY'), 'yes mani !', 'imported decode: b58btc decodes properly'); 9 + 10 + is($object->encode('base58btc', 'yes mani !'), 'z7paNL19xttacUY', 'imported encode: b58btc encodes properly'); 11 + is($object->decode('z7paNL19xttacUY'), 'yes mani !', 'imported decode: b58btc decodes properly'); 12 + 13 + done_testing();