Skip to content

Commit 87f8c02

Browse files
authored
Merge pull request #5799 from unisonweb/runarorama/avroMagic
Add Avro-decoder builtin and replacement function
2 parents 9d7d818 + 30d87f6 commit 87f8c02

File tree

25 files changed

+2644
-935
lines changed

25 files changed

+2644
-935
lines changed

parser-typechecker/src/Unison/Builtin/Decls.hs

Lines changed: 577 additions & 1 deletion
Large diffs are not rendered by default.

unison-runtime/package.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ library:
5353
- asn1-encoding
5454
- asn1-types
5555
- atomic-primops
56+
- avro
5657
- base
5758
- binary
5859
- bytes

unison-runtime/src/Unison/Runtime/Builtin.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,7 @@ declareForeigns = do
13021302
declareForeign Untracked 1 Json_toText
13031303
declareForeign Untracked 1 Json_unconsText
13041304
declareForeign Untracked 1 Json_tryUnconsText
1305+
declareForeign Untracked 3 Avro_decodeBinary
13051306

13061307
foreignDeclResults :: (Map ForeignFunc (Sandbox, SuperNormal Symbol))
13071308
foreignDeclResults =

unison-runtime/src/Unison/Runtime/Foreign/Function.hs

Lines changed: 398 additions & 0 deletions
Large diffs are not rendered by default.

unison-runtime/src/Unison/Runtime/Foreign/Function/Type.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ data ForeignFunc
279279
| Json_toText
280280
| Json_unconsText
281281
| Json_tryUnconsText
282+
| Avro_decodeBinary
282283
deriving (Show, Eq, Ord, Enum, Bounded)
283284

284285
foreignFuncBuiltinName :: ForeignFunc -> Text
@@ -554,3 +555,4 @@ foreignFuncBuiltinName = \case
554555
Json_toText -> "Json.toText"
555556
Json_unconsText -> "Json.unconsText"
556557
Json_tryUnconsText -> "Json.tryUnconsText"
558+
Avro_decodeBinary -> "avro.Value.tryDecodeBytes"

unison-runtime/src/Unison/Runtime/Stack.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ module Unison.Runtime.Stack
152152
asize,
153153
useg,
154154
bseg,
155+
segFromList,
155156

156157
-- * Unboxed type tags
157158
natTypeTag,

unison-runtime/src/Unison/Runtime/TypeTags.hs

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,102 @@ module Unison.Runtime.TypeTags
5050
jsonTextTag,
5151
jsonArrTag,
5252
jsonParseErrorTag,
53+
avroNullTag,
54+
avroRecordTag,
55+
avroBytesTag,
56+
avroFixedTag,
57+
avroArrayTag,
58+
avroMapTag,
59+
avroUnionTag,
60+
avroEnumTag,
61+
avroStringTag,
62+
avroIntTag,
63+
avroLongTag,
64+
avroFloatTag,
65+
avroDoubleTag,
66+
avroBooleanTag,
67+
avroReadSchemaNullTag,
68+
avroReadSchemaBooleanTag,
69+
avroReadSchemaIntTag,
70+
avroReadSchemaLongTag,
71+
avroReadSchemaFloatTag,
72+
avroReadSchemaDoubleTag,
73+
avroReadSchemaBytesTag,
74+
avroReadSchemaStringTag,
75+
avroReadSchemaArrayTag,
76+
avroReadSchemaMapTag,
77+
avroReadSchemaRecordTag,
78+
avroReadSchemaEnumTag,
79+
avroReadSchemaUnionTag,
80+
avroReadSchemaFixedTag,
81+
avroReadSchemaFreeUnionTag,
82+
avroReadSchemaNamedTypeTag,
83+
avroTypeNameTag,
84+
avroLogicalIntDateTag,
85+
avroLogicalIntTimeTag,
86+
avroLogicalIntDecimalTag,
87+
avroReadFloatFromInt32Tag,
88+
avroReadFloatFromInt64Tag,
89+
avroReadFloatTag,
90+
avroLogicalLongTimeMicrosTag,
91+
avroLogicalLongTimestampMillisTag,
92+
avroLogicalLongTimestampMicrosTag,
93+
avroLogicalLongLocalTimestampMillisTag,
94+
avroLogicalLongLocalTimestampMicrosTag,
95+
avroLogicalLongDecimalTag,
96+
avroLogicalFixedDurationTag,
97+
avroLogicalFixedDecimalTag,
98+
avroLogicalStringUUIDTag,
99+
avroReadDoubleFromInt32Tag,
100+
avroReadDoubleFromInt64Tag,
101+
avroReadDoubleFromFloatTag,
102+
avroReadDoubleTag,
103+
avroDecimalTag,
104+
avroReadLongInt32Tag,
105+
avroReadLongTag,
106+
avroLogicalBytesDecimalTag,
107+
avroLogicalStringUuidTag,
108+
avroReadFieldTag,
109+
avroFieldTag,
110+
avroFieldStatusAsIsTag,
111+
avroFieldStatusDefaultedTag,
112+
avroFieldStatusIgnoredTag,
113+
avroOrderAscendingTag,
114+
avroOrderDescendingTag,
115+
avroOrderIgnoreTag,
116+
avroDefaultValueIntTag,
117+
avroDefaultValueLongTag,
118+
avroDefaultValueFloatTag,
119+
avroDefaultValueDoubleTag,
120+
avroDefaultValueBytesTag,
121+
avroDefaultValueStringTag,
122+
avroDefaultValueArrayTag,
123+
avroDefaultValueMapTag,
124+
avroDefaultValueRecordTag,
125+
avroDefaultValueUnionTag,
126+
avroDefaultValueFixedTag,
127+
avroDefaultValueEnumTag,
128+
avroDefaultValueNullTag,
129+
avroDefaultValueBooleanTag,
130+
avroSchemaNullTag,
131+
avroSchemaBooleanTag,
132+
avroSchemaIntTag,
133+
avroSchemaLongTag,
134+
avroSchemaFloatTag,
135+
avroSchemaDoubleTag,
136+
avroSchemaBytesTag,
137+
avroSchemaStringTag,
138+
avroSchemaArrayTag,
139+
avroSchemaMapTag,
140+
avroSchemaNamedTypeTag,
141+
avroSchemaRecordTag,
142+
avroSchemaEnumTag,
143+
avroSchemaUnionTag,
144+
avroSchemaFixedTag,
145+
avroReadRecordTag,
146+
avroFixedTypeTag,
147+
avroRecordTypeTag,
148+
avroEnumTypeTag,
53149
)
54150
where
55151

@@ -337,6 +433,159 @@ jsonParseErrorTag
337433
pet
338434
| otherwise = error "internal error: json parse error tag"
339435

436+
avroNullTag, avroRecordTag, avroBytesTag, avroFixedTag, avroArrayTag, avroMapTag, avroUnionTag, avroEnumTag, avroStringTag, avroIntTag, avroLongTag, avroFloatTag, avroDoubleTag, avroBooleanTag :: PackedTag
437+
(avroNullTag, avroRecordTag, avroBytesTag, avroFixedTag, avroArrayTag, avroMapTag, avroUnionTag, avroEnumTag, avroStringTag, avroIntTag, avroLongTag, avroFloatTag, avroDoubleTag, avroBooleanTag)
438+
| [nlt, rct, bct, fct, act, mct, ut, et, st, it, lt, ft, dt, bt] <-
439+
mkTags
440+
"avro tags"
441+
Ty.avroRef
442+
[Ty.avroNull, Ty.avroRecord, Ty.avroBytes, Ty.avroFixed, Ty.avroArray, Ty.avroMap, Ty.avroUnion, Ty.avroEnum, Ty.avroString, Ty.avroInt, Ty.avroLong, Ty.avroFloat, Ty.avroDouble, Ty.avroBoolean] =
443+
(nlt, rct, bct, fct, act, mct, ut, et, st, it, lt, ft, dt, bt)
444+
| otherwise = error "internal error: avro tags"
445+
446+
avroFixedTypeTag :: PackedTag
447+
avroFixedTypeTag = mkSimpleTag "avroFixedTypeTag" Ty.avroFixedRef
448+
449+
avroRecordTypeTag :: PackedTag
450+
avroRecordTypeTag = mkSimpleTag "avroRecordTypeTag" Ty.avroRecordRef
451+
452+
avroEnumTypeTag :: PackedTag
453+
avroEnumTypeTag = mkSimpleTag "avroEnumTypeTag" Ty.avroEnumRef
454+
455+
avroDefaultValueIntTag, avroDefaultValueLongTag, avroDefaultValueFloatTag, avroDefaultValueDoubleTag, avroDefaultValueBytesTag, avroDefaultValueStringTag, avroDefaultValueArrayTag, avroDefaultValueMapTag, avroDefaultValueRecordTag, avroDefaultValueUnionTag, avroDefaultValueFixedTag, avroDefaultValueEnumTag, avroDefaultValueNullTag, avroDefaultValueBooleanTag :: PackedTag
456+
(avroDefaultValueIntTag, avroDefaultValueLongTag, avroDefaultValueFloatTag, avroDefaultValueDoubleTag, avroDefaultValueBytesTag, avroDefaultValueStringTag, avroDefaultValueArrayTag, avroDefaultValueMapTag, avroDefaultValueRecordTag, avroDefaultValueUnionTag, avroDefaultValueFixedTag, avroDefaultValueEnumTag, avroDefaultValueNullTag, avroDefaultValueBooleanTag)
457+
| [it, lt, ft, dt, bct, st, art, mct, rct, ut, fct, ent, nct, bot] <-
458+
mkTags
459+
"avro default value tags"
460+
Ty.avroDefaultValueRef
461+
[Ty.avroDefaultValueInt32, Ty.avroDefaultValueInt64, Ty.avroDefaultValueFloat, Ty.avroDefaultValueDouble, Ty.avroDefaultValueBytes, Ty.avroDefaultValueString, Ty.avroDefaultValueArray, Ty.avroDefaultValueMap, Ty.avroDefaultValueRecord, Ty.avroDefaultValueUnion, Ty.avroDefaultValueFixed, Ty.avroDefaultValueEnum, Ty.avroDefaultValueNull, Ty.avroDefaultValueBoolean] =
462+
(it, lt, ft, dt, bct, st, art, mct, rct, ut, fct, ent, nct, bot)
463+
| otherwise = error "internal error: avro default value tags"
464+
465+
avroReadSchemaNullTag, avroReadSchemaBooleanTag, avroReadSchemaStringTag, avroReadSchemaFloatTag, avroReadSchemaFixedTag, avroReadSchemaDoubleTag, avroReadSchemaBytesTag, avroReadSchemaNamedTypeTag, avroReadSchemaIntTag, avroReadSchemaLongTag, avroReadSchemaMapTag, avroReadSchemaRecordTag, avroReadSchemaFreeUnionTag, avroReadSchemaEnumTag, avroReadSchemaUnionTag, avroReadSchemaArrayTag :: PackedTag
466+
(avroReadSchemaNullTag, avroReadSchemaBooleanTag, avroReadSchemaStringTag, avroReadSchemaFloatTag, avroReadSchemaFixedTag, avroReadSchemaDoubleTag, avroReadSchemaBytesTag, avroReadSchemaNamedTypeTag, avroReadSchemaIntTag, avroReadSchemaLongTag, avroReadSchemaMapTag, avroReadSchemaRecordTag, avroReadSchemaFreeUnionTag, avroReadSchemaEnumTag, avroReadSchemaUnionTag, avroReadSchemaArrayTag)
467+
| [nullTag, booleanTag, stringTag, floatTag, fixedTag, doubleTag, bytesTag, namedTypeTag, intTag, longTag, mapTag, recordTag, freeUnionTag, enumTag, unionTag, arrayTag] <-
468+
mkTags
469+
"avro read schema tags"
470+
Ty.avroReadSchemaRef
471+
[Ty.avroReadSchemaNull, Ty.avroReadSchemaBoolean, Ty.avroReadSchemaString, Ty.avroReadSchemaFloat, Ty.avroReadSchemaFixed, Ty.avroReadSchemaDouble, Ty.avroReadSchemaBytes, Ty.avroReadSchemaNamedType, Ty.avroReadSchemaInt, Ty.avroReadSchemaLong, Ty.avroReadSchemaMap, Ty.avroReadSchemaRecord, Ty.avroReadSchemaFreeUnion, Ty.avroReadSchemaEnum, Ty.avroReadSchemaUnion, Ty.avroReadSchemaArray] =
472+
(nullTag, booleanTag, stringTag, floatTag, fixedTag, doubleTag, bytesTag, namedTypeTag, intTag, longTag, mapTag, recordTag, freeUnionTag, enumTag, unionTag, arrayTag)
473+
| otherwise = error "internal error: avro readschema tags"
474+
475+
avroSchemaNullTag, avroSchemaBooleanTag, avroSchemaIntTag, avroSchemaLongTag, avroSchemaFloatTag, avroSchemaDoubleTag, avroSchemaBytesTag, avroSchemaStringTag, avroSchemaArrayTag, avroSchemaMapTag, avroSchemaNamedTypeTag, avroSchemaRecordTag, avroSchemaEnumTag, avroSchemaUnionTag, avroSchemaFixedTag :: PackedTag
476+
(avroSchemaNullTag, avroSchemaBooleanTag, avroSchemaIntTag, avroSchemaLongTag, avroSchemaFloatTag, avroSchemaDoubleTag, avroSchemaBytesTag, avroSchemaStringTag, avroSchemaArrayTag, avroSchemaMapTag, avroSchemaNamedTypeTag, avroSchemaRecordTag, avroSchemaEnumTag, avroSchemaUnionTag, avroSchemaFixedTag)
477+
| [nlt, bot, it, lt, ft, dt, bst, st, at, mt, ntt, rct, ent, ut, fxt] <-
478+
mkTags
479+
"avro schema tags"
480+
Ty.avroSchemaRef
481+
[Ty.avroSchemaNull, Ty.avroSchemaBoolean, Ty.avroSchemaInt, Ty.avroSchemaLong, Ty.avroSchemaFloat, Ty.avroSchemaDouble, Ty.avroSchemaBytes, Ty.avroSchemaString, Ty.avroSchemaArray, Ty.avroSchemaMap, Ty.avroSchemaNamedType, Ty.avroSchemaRecord, Ty.avroSchemaEnum, Ty.avroSchemaUnion, Ty.avroSchemaFixed] =
482+
(nlt, bot, it, lt, ft, dt, bst, st, at, mt, ntt, rct, ent, ut, fxt)
483+
| otherwise = error "internal error: avro schema tags"
484+
485+
avroLogicalIntDateTag, avroLogicalIntTimeTag, avroLogicalIntDecimalTag :: PackedTag
486+
(avroLogicalIntDateTag, avroLogicalIntTimeTag, avroLogicalIntDecimalTag)
487+
| [dt, tt, dect] <-
488+
mkTags
489+
"avro logical int tags"
490+
Ty.avroLogicalIntRef
491+
[Ty.avroLogicalIntDate, Ty.avroLogicalIntTime, Ty.avroLogicalIntDecimal] =
492+
(dt, tt, dect)
493+
| otherwise = error "internal error: avro logical int tags"
494+
495+
avroReadFieldTag :: PackedTag
496+
avroReadFieldTag = mkSimpleTag "avroReadFieldTag" Ty.avroReadFieldRef
497+
498+
avroFieldTag :: PackedTag
499+
avroFieldTag = mkSimpleTag "avroFieldTag" Ty.avroFieldRef
500+
501+
avroReadRecordTag :: PackedTag
502+
avroReadRecordTag = mkSimpleTag "avroReadRecordTag" Ty.avroReadRecordRef
503+
504+
avroLogicalStringUuidTag :: PackedTag
505+
avroLogicalStringUuidTag = mkSimpleTag "avroLogicalStringUuidTag" Ty.avroLogicalStringRef
506+
507+
avroLogicalBytesDecimalTag :: PackedTag
508+
avroLogicalBytesDecimalTag = mkSimpleTag "avroLogicalBytesDecimalTag" Ty.avroLogicalBytesRef
509+
510+
avroLogicalLongTimeMicrosTag, avroLogicalLongTimestampMillisTag, avroLogicalLongTimestampMicrosTag, avroLogicalLongLocalTimestampMillisTag, avroLogicalLongLocalTimestampMicrosTag, avroLogicalLongDecimalTag :: PackedTag
511+
(avroLogicalLongTimeMicrosTag, avroLogicalLongTimestampMillisTag, avroLogicalLongTimestampMicrosTag, avroLogicalLongLocalTimestampMillisTag, avroLogicalLongLocalTimestampMicrosTag, avroLogicalLongDecimalTag)
512+
| [tmct, tsmst, tsmcst, ltsmst, ltsmcst, decct] <-
513+
mkTags
514+
"avro logical long tags"
515+
Ty.avroLogicalLongRef
516+
[Ty.avroLogicalLongTimeMicros, Ty.avroLogicalLongTimestampMillis, Ty.avroLogicalLongTimestampMicros, Ty.avroLogicalLongLocalTimestampMillis, Ty.avroLogicalLongLocalTimestampMicros, Ty.avroLogicalLongDecimal] =
517+
(tmct, tsmst, tsmcst, ltsmst, ltsmcst, decct)
518+
| otherwise = error "internal error: avro logical long tags"
519+
520+
avroLogicalFixedDurationTag, avroLogicalFixedDecimalTag :: PackedTag
521+
(avroLogicalFixedDurationTag, avroLogicalFixedDecimalTag)
522+
| [durt, decct] <-
523+
mkTags
524+
"avro logical fixed tags"
525+
Ty.avroLogicalFixedRef
526+
[Ty.avroLogicalFixedDuration, Ty.avroLogicalFixedDecimal] =
527+
(durt, decct)
528+
| otherwise = error "internal error: avro logical fixed tags"
529+
530+
avroLogicalStringUUIDTag :: PackedTag
531+
avroLogicalStringUUIDTag = mkSimpleTag "avroLogicalStringUUIDTag" Ty.avroLogicalStringRef
532+
533+
avroReadFloatFromInt32Tag, avroReadFloatFromInt64Tag, avroReadFloatTag :: PackedTag
534+
(avroReadFloatFromInt32Tag, avroReadFloatFromInt64Tag, avroReadFloatTag)
535+
| [i32t, i64t, ft] <-
536+
mkTags
537+
"avro read float tags"
538+
Ty.avroReadFloatRef
539+
[Ty.avroReadFloatInt32, Ty.avroReadFloatInt64, Ty.avroReadFloat] =
540+
(i32t, i64t, ft)
541+
| otherwise = error "internal error: avro read float tags"
542+
543+
avroReadDoubleFromInt32Tag, avroReadDoubleFromInt64Tag, avroReadDoubleFromFloatTag, avroReadDoubleTag :: PackedTag
544+
(avroReadDoubleFromInt32Tag, avroReadDoubleFromInt64Tag, avroReadDoubleFromFloatTag, avroReadDoubleTag)
545+
| [i32t, i64t, ft, dt] <-
546+
mkTags
547+
"avro read double tags"
548+
Ty.avroReadDoubleRef
549+
[Ty.avroReadDoubleInt32, Ty.avroReadDoubleInt64, Ty.avroReadDoubleFromFloat, Ty.avroReadDouble] =
550+
(i32t, i64t, ft, dt)
551+
| otherwise = error "internal error: avro read double tags"
552+
553+
avroReadLongInt32Tag, avroReadLongTag :: PackedTag
554+
(avroReadLongInt32Tag, avroReadLongTag)
555+
| [i32t, lt] <-
556+
mkTags
557+
"avro read long tags"
558+
Ty.avroReadLongRef
559+
[Ty.avroReadLongInt32, Ty.avroReadLong] =
560+
(i32t, lt)
561+
| otherwise = error "internal error: avro read long tags"
562+
563+
avroTypeNameTag :: PackedTag
564+
avroTypeNameTag = mkSimpleTag "avroTypeNameTag" Ty.avroTypeNameRef
565+
566+
avroDecimalTag :: PackedTag
567+
avroDecimalTag = mkSimpleTag "avroDecimalTag" Ty.avroDecimalRef
568+
569+
avroFieldStatusAsIsTag, avroFieldStatusDefaultedTag, avroFieldStatusIgnoredTag :: PackedTag
570+
(avroFieldStatusAsIsTag, avroFieldStatusDefaultedTag, avroFieldStatusIgnoredTag)
571+
| [ast, dct, igt] <-
572+
mkTags
573+
"avro field status tags"
574+
Ty.avroFieldStatusRef
575+
[Ty.avroFieldStatusAsIs, Ty.avroFieldStatusDefaulted, Ty.avroFieldStatusIgnored] =
576+
(ast, dct, igt)
577+
| otherwise = error "internal error: avro field status tags"
578+
579+
avroOrderAscendingTag, avroOrderDescendingTag, avroOrderIgnoreTag :: PackedTag
580+
(avroOrderAscendingTag, avroOrderDescendingTag, avroOrderIgnoreTag)
581+
| [ast, dct, igt] <-
582+
mkTags
583+
"avro order tags"
584+
Ty.avroOrderRef
585+
[Ty.avroOrderAscending, Ty.avroOrderDescending, Ty.avroOrderIgnore] =
586+
(ast, dct, igt)
587+
| otherwise = error "internal error: avro order tags"
588+
340589
-- | A tag we use to represent the 'pure' effect case.
341590
pureEffectTag :: PackedTag
342591
pureEffectTag = PackedTag 0

unison-runtime/unison-runtime.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ library
109109
asn1-encoding
110110
, asn1-types
111111
, atomic-primops
112+
, avro
112113
, base
113114
, binary
114115
, bytes

unison-src/transcripts-round-trip/main.output.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ structural type SomethingUnusuallyLong
8080
= SomethingUnusuallyLong Text Text Text
8181
8282
structural type UUID
83-
= UUID Nat (Nat, Nat)
83+
= UUUID Nat (Nat, Nat)
8484
8585
structural ability Zoink where
8686
nay : Text -> (Nat, Nat) ->{Zoink} Nat
@@ -816,11 +816,11 @@ use_clauses_example2 oo =
816816
bar.quaffle + bar.quaffle + bar.quaffle + 1
817817
818818
UUID.random : 'UUID
819-
UUID.random = do UUID 0 (0, 0)
819+
UUID.random = do UUUID 0 (0, 0)
820820
821821
UUID.randomUUIDBytes : 'Bytes
822822
UUID.randomUUIDBytes = do
823-
(UUID a (b, _)) = random()
823+
(UUUID a (b, _)) = random()
824824
encodeNat64be a Bytes.++ encodeNat64be b
825825
826826
(|>) : a -> (a ->{e} b) ->{e} b

unison-src/transcripts-round-trip/reparses-with-same-hash.u

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,14 +217,14 @@ ex3a =
217217
-- Make sure use clauses don't show up before a soft hang
218218
-- Regression test for https://github.com/unisonweb/unison/issues/3883
219219

220-
structural type UUID = UUID Nat (Nat, Nat)
220+
structural type UUID = UUUID Nat (Nat, Nat)
221221

222222
UUID.random : 'UUID
223-
UUID.random = do UUID 0 (0,0)
223+
UUID.random = do UUID.UUUID 0 (0,0)
224224

225225
UUID.randomUUIDBytes : 'Bytes
226226
UUID.randomUUIDBytes = do
227-
(UUID a (b,_)) = !UUID.random
227+
(UUID.UUUID a (b,_)) = !UUID.random
228228
(encodeNat64be a) ++ (encodeNat64be b)
229229

230230
-- Raw string round trip

0 commit comments

Comments
 (0)