Commit Graph

38 Commits

Author SHA1 Message Date
microproofs d05d8e7de6 Start working on separating pairs from 2 tuples in Aiken
co-authored-by: KtorZ <matthias.benkort@gmail.com>
2024-05-04 14:04:12 -04:00
KtorZ a578728a94
Resolve type aliases based on inferred types.
Before this commit, we would always show the 'declared form' of type aliases, with their generic, non-instantiated parameters. This now tries to unify the annotation with the underlying inferred type to provide even better alias pretty printing.
2024-03-08 16:01:21 +01:00
KtorZ ed9f5c6ef7
Preserve TypeAlias in types for better context/feedback. 2024-03-08 15:59:33 +01:00
KtorZ 84c4ccaf4c
Forbid opaque types in the application binary interface.
We cannot enforce internal invariants on opaque types from only structural checks on Data. Thus, it is forbidden to find an opaque type in an outward-facing interface. Instead, users should rely on intermediate representations and lift them into opaque types using constructors and methods provided by the type (e.g. Dict.from_list, Rational.from_int, Rational.new, ...)
2024-03-03 13:55:10 +01:00
microproofs 4a8fecb70a fix: satisfy clippy's demands 2024-01-11 14:53:02 -05:00
rvcas 7b915b7dcf
chore: allow clippy::arc_with_non_send_sync in tests 2023-09-13 19:07:45 -04:00
rvcas d808197507
chore: clippy fix 2023-09-13 18:17:59 -04:00
rvcas 8a7df7f66b
test: add empty list test 2023-07-04 17:19:29 -04:00
rvcas 9c29f4f26b
fix: blueprints gen failing on List
closes #569

* added new methods to Definitions
  it doesn't use expect
* lookup was failing for the special map/pair case
  when resolving list generics

Co-authored-by: Pi <pi@sundaeswap.finance>
2023-06-02 17:53:10 -04:00
KtorZ bf222a3ea2
Fix reference JSON deserialization. 2023-04-08 08:57:40 +02:00
KtorZ d58ef1a079
Implement blueprint schema & data validations. 2023-04-08 08:57:03 +02:00
KtorZ ee220881b6
Generalize schema definition to work from inline schema or reference. 2023-04-08 08:57:03 +02:00
KtorZ d620f6367c
Bootstrap schema validation for simple constants. 2023-04-08 08:57:03 +02:00
KtorZ f0d2d20a4c
Impl JSON deserialization for blueprint's 'Schema'. 2023-04-08 08:53:51 +02:00
KtorZ 565c0bea74
Write JSON deserializers for Reference, Constructors, Items and Data.
This is needed in order to deserialize a JSON blueprint and use it to perform validation.
  Still TODO:

  - [ ] Write JSON deserializer for 'Schema'

  Which should now be relatively straightforward.
2023-04-08 08:53:49 +02:00
KtorZ bc690c5410
Generated wrapped schemas for multi-validators' redeemers 2023-03-17 18:40:49 -04:00
KtorZ ae981403c6 Re-introduce field title & description in referenced schemas. 2023-03-12 12:44:49 -04:00
KtorZ 451737237e Fix blueprint generation for recursive types.
This was a bit tricky and I ended up breaking things down a lot and
  trying different path. This commit is the result of the most
  satisfying one.

  It introduces a new 'concept' and types: Definitions and Reference.
  These elements are meant to reflect JSON pointers and JSON-schema
  definitions which we now use for pretty much all user-defined
  data-types.

  In fact, Schemas are no longer inlined, but are always referencing
  some schema under "definitions".

  This indirection is necessary in order to cope with recursive types.
  And while it's only truly necessary for recursive types, using it
  consistently makes it both easier to produce and easier to consume.

  ---

  The blueprint generation for recursive types here also works thanks to
  the 'Definitions' data-structure wrapper around a BTreeMap. This uses
  a strategy where:

  (1) schemas are only generated if they haven't been seen before
  (2) schemas are marked as seen BEFORE actually being generated (to
  effectively stop a recursive generation).

  This relies on one important aspect: the key must be uniquely
  identifying a given schema. Which means that we have to monomorphize
  data-types with generic parameters also here, and use keys that are
  specialized in one data-type.

  ---

  In this large overhaul we've also lost one thing which I didn't bother
  re-introducing yet to keep the work manageable: title for record
  fields. Before, we use to pull those from record constructor when
  available, yet now, every record constructor has been replaced by a
  `$ref`. We could theoritically attach a title to the reference. I'll
  try to quickly add that in a later commit.
2023-03-12 12:44:49 -04:00
KtorZ f67e049dc2 Introduce indirection for fields. 2023-03-12 12:44:49 -04:00
KtorZ 3a7aac0a33 Make blueprint code slightly more resilient to changes.
Leverage traits instead of hard-coded type parameters.
2023-03-12 12:44:49 -04:00
KtorZ a66c9bd2c3
Remove redundant match on tuple blueprint generation. 2023-03-08 16:40:03 +01:00
KtorZ 6d098a4571 Fix blueprint generation for nested fields with Data
Having the data's schema be optional at the level of the 'Schema' did not allow to represent cases where there would be an opaque data at an arbitrary nesting. So I introduced a new variant 'Opaque' on 'Data' to fill that gap.
2023-03-02 15:25:17 -05:00
KtorZ a46a9fca41
Only use colors & text decorations on ANSI-capable terminals.
Fixes #404.
2023-02-26 13:19:03 +01:00
KtorZ 0838d48f7c
Move module name validation outside of type-checking
And disable it for documentation generation. This way, we can generate documentation for aiken/builtins and aiken (prelude)
2023-02-22 11:51:32 +01:00
KtorZ db0dfbbec1
Fix blueprint schema for tuples. 2023-02-21 15:29:33 +01:00
rvcas 673b57b81c feat: get bluprint stuff compiling again 2023-02-16 00:05:55 -05:00
KtorZ 62fe321ddf
Add 'Ordering' data-type to the Prelude.
Useful to have around to build comparison functions.
2023-02-09 11:07:30 +01:00
KtorZ 95a62f7172
Fix oversights in blueprint / schema generation. 2023-02-08 19:04:50 +01:00
KtorZ ea269b14a2
Fix deserialization issue when 'parameters' is missing.
Deserialize to an empty vector.
2023-02-04 11:38:09 +01:00
KtorZ 1aa12fb368
Implement serde's Deserialize for blueprints.
Here's a trick though: I got lazy (a bit) and did not write a full deserializer for Schema because this is busywork and not at all necessary at this stage. Instead, I've made the blueprint parameterized by a generic type <T>; which represents the type of the underlying blueprint's schema. When deserializing from JSON, we can default to 'Value' to get a free deserializer. Since all we're interested about is the program and the metadata (purpose and title) of a validator, it works nicely.

  Serialization however expects a Blueprint<Schema>, and most of the functions operates over a Blueprint<Schema> anyway.
2023-01-31 15:39:40 +01:00
KtorZ 90ee86d14e
Improve error reporting for the blueprint generation.
Actually link schema error to source code with a span and a label. This is easily done and provides some extra context.
2023-01-31 09:48:45 +01:00
KtorZ 2523816813
Handle opaque single-variant-single-field special case. 2023-01-31 09:48:45 +01:00
KtorZ aaa8cba0cf
Fix nested generics and phantom-types, and handle list special case
List of pairs are actually encoded as 'map'.
2023-01-31 09:48:45 +01:00
KtorZ 9a44cba007
Add support for generics in the blueprint generation. 2023-01-31 09:48:45 +01:00
KtorZ 0bd9d045b0
Support tuples in blueprint generation. 2023-01-31 09:48:44 +01:00
KtorZ b93e14659c
Refactor blueprint & handle annotated schemas
This also now introduce two levels of representable types (because it's needed at least for tuples):

  Plutus Data (a.k.a Data) and UPLC primitives / constants (a.k.a Schema).

  In practice, we don't want to specify blueprints that use direct UPLC primitives because there's little support for producing those in the ecosystem. So we should aim for producing only Data whenever we can. Yet we don't want to forbid it either in case people know what they're doing. Which means that we need to capture that difference well in the type modelling (in Rust and in the CIP-0057 specification).

  I've also simplified the error type for now, just to provide some degree of feedback while working on this. I'll refine it later with proper errors.
2023-01-31 09:48:44 +01:00
KtorZ 547696abde
Add title and description to exported types in the blueprint
This also fixes a bug where the documentation of record constructor arguments would be dropped after type-checking. Took me a while to pinpoint.
2023-01-31 09:48:44 +01:00
KtorZ 5683d19a4c
Refactor build steps to generate blueprints instead
The blueprint is generated at the root of the repository and is
  intended to be versioned with the rest. It acts as a business card
  that contains many practical information. There's a variety of tools
  we can then build on top of open-source contracts. And, quite
  importantly, the blueprint is language-agnostic; it isn't specific to
  Aiken. So it is really meant as an interop format within the
  ecosystem.
2023-01-31 09:48:38 +01:00