Exemplo n.º 1
0
        static void ReadAnnotsToJson(BinaryReader reader, Utf8JsonWriter writer, int count)
        {
            writer.WriteStartArray("annots");
            while (count-- > 0)
            {
                var tag = reader.ReadByte();

                var cnt = tag & 0x3F;
                if (cnt == 0x3F)
                {
                    cnt = reader.Read7BitInt();
                }
                var str = Utf8.Convert(reader.ReadBytes(cnt));

                switch (tag & 0b_1100_0000)
                {
                case (int)AnnotationType.Field:
                    writer.WriteStringValue($"{FieldAnnotation.Prefix}{str}");
                    break;

                case (int)AnnotationType.Type:
                    writer.WriteStringValue($"{TypeAnnotation.Prefix}{str}");
                    break;

                case (int)AnnotationType.Variable:
                    writer.WriteStringValue($"{VariableAnnotation.Prefix}{str}");
                    break;

                default:
                    writer.WriteStringValue(str);
                    break;
                }
            }
            writer.WriteEndArray();
        }
Exemplo n.º 2
0
        static void ReadAnnots(BinaryReader reader, MichelinePrim prim)
        {
            while (prim.Annots.Count != prim.Annots.Capacity)
            {
                var tag = reader.ReadByte();

                var cnt = tag & 0x3F;
                if (cnt == 0x3F)
                {
                    cnt = reader.Read7BitInt();
                }
                var str = Utf8.Convert(reader.ReadBytes(cnt));

                switch (tag & 0b_1100_0000)
                {
                case (int)AnnotationType.Field:
                    prim.Annots.Add(new FieldAnnotation(str));
                    break;

                case (int)AnnotationType.Type:
                    prim.Annots.Add(new TypeAnnotation(str));
                    break;

                case (int)AnnotationType.Variable:
                    prim.Annots.Add(new VariableAnnotation(str));
                    break;

                default:
                    prim.Annots.Add(new UnsafeAnnotation(str));
                    break;
                }
            }
        }
Exemplo n.º 3
0
        static IAnnotation ReadAnnotation(BinaryReader reader)
        {
            var tag = reader.ReadByte();

            var cnt = tag & 0x3F;

            if (cnt == 0x3F)
            {
                cnt = reader.Read7BitInt();
            }
            var str = Utf8.Convert(reader.ReadBytes(cnt));

            switch (tag & 0b_1100_0000)
            {
            case (int)AnnotationType.Field:
                return(new FieldAnnotation(str));

            case (int)AnnotationType.Type:
                return(new TypeAnnotation(str));

            case (int)AnnotationType.Variable:
                return(new VariableAnnotation(str));

            default:
                return(new UnsafeAnnotation(str));
            }
        }
Exemplo n.º 4
0
        public string Humanize(IMicheline value, JsonWriterOptions options = default)
        {
            using (var mem = new MemoryStream())
                using (var writer = new Utf8JsonWriter(mem, options))
                {
                    WriteValue(writer, value);
                    writer.Flush();

                    return(Utf8.Convert(mem.ToArray()));
                }
        }
Exemplo n.º 5
0
        public string GetJsonSchema(JsonWriterOptions options = default)
        {
            using (var mem = new MemoryStream())
                using (var writer = new Utf8JsonWriter(mem, options))
                {
                    writer.WriteStartObject();
                    writer.WriteString("$schema", "http://json-schema.org/draft/2019-09/schema#");
                    WriteJsonSchema(writer);
                    writer.WriteEndObject();
                    writer.Flush();

                    return(Utf8.Convert(mem.ToArray()));
                }
        }
Exemplo n.º 6
0
        public string Humanize(JsonWriterOptions options = default)
        {
            using (var mem = new MemoryStream())
                using (var writer = new Utf8JsonWriter(mem, options))
                {
                    writer.WriteStartObject();
                    writer.WritePropertyName($"schema:{Signature}");
                    WriteValue(writer);
                    writer.WriteEndObject();
                    writer.Flush();

                    return(Utf8.Convert(mem.ToArray()));
                }
        }
Exemplo n.º 7
0
        public string ReadString(int len = 4)
        {
            var stringLength = ReadInt32(len);

            return(Utf8.Convert(ReadBytes(stringLength)));
        }
Exemplo n.º 8
0
        public string Flatten(IMicheline value)
        {
            if (value is MichelineString micheString)
            {
                return(micheString.Value);
            }
            else if (value is MichelineBytes micheBytes)
            {
                if (micheBytes.Value.Length < 22)
                {
                    return(Hex.Convert(micheBytes.Value));
                }

                byte[] prefix;
                if (micheBytes.Value[0] == 0)
                {
                    if (micheBytes.Value[1] == 0)
                    {
                        prefix = Prefix.tz1;
                    }
                    else if (micheBytes.Value[1] == 1)
                    {
                        prefix = Prefix.tz2;
                    }
                    else if (micheBytes.Value[1] == 2)
                    {
                        prefix = Prefix.tz3;
                    }
                    else
                    {
                        return(Hex.Convert(micheBytes.Value));
                    }
                }
                else if (micheBytes.Value[0] == 1)
                {
                    if (micheBytes.Value[21] == 0)
                    {
                        prefix = Prefix.KT1;
                    }
                    else
                    {
                        return(Hex.Convert(micheBytes.Value));
                    }
                }
                else
                {
                    return(Hex.Convert(micheBytes.Value));
                }

                var bytes = micheBytes.Value[0] == 0
                    ? micheBytes.Value.GetBytes(2, 20)
                    : micheBytes.Value.GetBytes(1, 20);

                var address    = Base58.Convert(bytes, prefix);
                var entrypoint = micheBytes.Value.Length > 22
                    ? Utf8.Convert(micheBytes.Value.GetBytes(22, micheBytes.Value.Length - 22))
                    : string.Empty;

                return(entrypoint.Length == 0 ? address : $"{address}%{entrypoint}");
            }
            else
            {
                throw FormatException(value);
            }
        }
Exemplo n.º 9
0
        static IMicheline ReadFlat(BinaryReader reader)
        {
            Stack <IMicheline> stack = new();
            IMicheline         node, top;
            MichelinePrim      prim;
            MichelineArray     arr;
            int tag, cnt, args, annots;

start:
            tag = reader.ReadByte();
            if (tag >= 0x80)
            {
                prim = new() { Prim = (PrimType)reader.ReadByte() };

                annots = tag & 0x0F;
                if (annots > 0)
                {
                    if (annots == 0x0F)
                    {
                        annots = reader.Read7BitInt();
                    }
                    prim.Annots = new(annots);
                }

                args = (tag & 0x70) >> 4;
                if (args > 0)
                {
                    if (args == 0x07)
                    {
                        args = reader.Read7BitInt();
                    }
                    prim.Args = new(args);

                    stack.Push(prim);
                    goto start;
                }

                if (prim.Annots != null)
                {
                    ReadAnnots(reader, prim);
                }

                node = prim;
            }
            else
            {
                cnt = tag & 0x1F;
                if (cnt == 0x1F)
                {
                    cnt = reader.Read7BitInt();
                }

                switch ((MichelineType)(tag & 0xE0))
                {
                case MichelineType.Array:
                    node = new MichelineArray(cnt);
                    if (cnt > 0)
                    {
                        stack.Push(node);
                        goto start;
                    }
                    break;

                case MichelineType.Bytes:
                    node = new MichelineBytes(reader.ReadBytes(cnt));
                    break;

                case MichelineType.Int:
                    node = new MichelineInt(new BigInteger(reader.ReadBytes(cnt)));
                    break;

                case MichelineType.String:
                    node = new MichelineString(Utf8.Convert(reader.ReadBytes(cnt)));
                    break;

                default:
                    throw new FormatException("Invalid micheline tag");
                }
            }
finish:
            if (stack.Count == 0)
            {
                return(node);
            }
            top = stack.Peek();
            if (top is MichelinePrim p)
            {
                p.Args.Add(node);
                if (p.Args.Count < p.Args.Capacity)
                {
                    goto start;
                }
                if (p.Annots != null)
                {
                    ReadAnnots(reader, p);
                }
            }
            else
            {
                arr = (MichelineArray)top;
                arr.Add(node);
                if (arr.Count < arr.Capacity)
                {
                    goto start;
                }
            }
            node = stack.Pop();
            goto finish;
        }
Exemplo n.º 10
0
        public static IMicheline Read(BinaryReader reader, int depth = 0)
        {
            var tag = reader.ReadByte();

            if (tag >= 0x80)
            {
                var prim = new MichelinePrim {
                    Prim = (PrimType)reader.ReadByte()
                };

                var args = (tag & 0x70) >> 4;
                if (args > 0)
                {
                    if (args == 0x07)
                    {
                        args = reader.Read7BitInt();
                    }

                    prim.Args = new List <IMicheline>(args);
                    if (depth < Micheline.MaxRecursionDepth)
                    {
                        while (args-- > 0)
                        {
                            prim.Args.Add(Read(reader, depth + 1));
                        }
                    }
                    else
                    {
                        while (args-- > 0)
                        {
                            prim.Args.Add(ReadFlat(reader));
                        }
                    }
                }

                var annots = tag & 0x0F;
                if (annots > 0)
                {
                    if (annots == 0x0F)
                    {
                        annots = reader.Read7BitInt();
                    }

                    prim.Annots = new List <IAnnotation>(annots);
                    while (annots-- > 0)
                    {
                        prim.Annots.Add(ReadAnnotation(reader));
                    }
                }

                return(prim);
            }
            else
            {
                var cnt = tag & 0x1F;
                if (cnt == 0x1F)
                {
                    cnt = reader.Read7BitInt();
                }

                switch ((MichelineType)(tag & 0xE0))
                {
                case MichelineType.Array:
                    var arr = new MichelineArray(cnt);
                    if (depth < Micheline.MaxRecursionDepth)
                    {
                        while (cnt-- > 0)
                        {
                            arr.Add(Read(reader, depth + 1));
                        }
                    }
                    else
                    {
                        while (cnt-- > 0)
                        {
                            arr.Add(ReadFlat(reader));
                        }
                    }
                    return(arr);

                case MichelineType.Bytes:
                    return(new MichelineBytes(reader.ReadBytes(cnt)));

                case MichelineType.Int:
                    return(new MichelineInt(new BigInteger(reader.ReadBytes(cnt))));

                case MichelineType.String:
                    return(new MichelineString(Utf8.Convert(reader.ReadBytes(cnt))));

                default:
                    throw new FormatException("Invalid micheline tag");
                }
            }
        }