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>
This commit is contained in:
rvcas 2023-06-02 17:50:01 -04:00
parent 6609ab335c
commit 9c29f4f26b
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
3 changed files with 31 additions and 29 deletions

View File

@ -33,7 +33,7 @@ impl<T> Definitions<T> {
self.inner.is_empty() self.inner.is_empty()
} }
/// Retrieve a definition, if it exists. /// Retrieve a definition, if it exists; fail if not resolved
pub fn lookup(&self, reference: &Reference) -> Option<&T> { pub fn lookup(&self, reference: &Reference) -> Option<&T> {
self.inner self.inner
.get(&reference.as_key()) .get(&reference.as_key())
@ -43,6 +43,11 @@ impl<T> Definitions<T> {
) )
} }
/// Retrieve a definition, if it exists and is resolved.
pub fn try_lookup(&self, reference: &Reference) -> Option<&T> {
self.inner.get(&reference.as_key()).and_then(|v| v.as_ref())
}
/// Merge two set of definitions together. Prioritize callee. /// Merge two set of definitions together. Prioritize callee.
pub fn merge(&mut self, other: &mut Definitions<T>) { pub fn merge(&mut self, other: &mut Definitions<T>) {
self.inner.append(&mut other.inner); self.inner.append(&mut other.inner);

View File

@ -293,17 +293,11 @@ impl Annotated<Schema> {
// from the PlutusTx / LedgerApi Haskell codebase, which encodes some elements // from the PlutusTx / LedgerApi Haskell codebase, which encodes some elements
// as such. We don't have a concept of language maps in Aiken, so we simply // as such. We don't have a concept of language maps in Aiken, so we simply
// make all types abide by this convention. // make all types abide by this convention.
let data = match definitions let data = match definitions.try_lookup(&generic).cloned() {
.lookup(&generic) Some(Annotated {
.expect(
"Generic type argument definition was registered just above.",
)
.clone()
{
Annotated {
annotated: Schema::Data(Data::List(Items::Many(xs))), annotated: Schema::Data(Data::List(Items::Many(xs))),
.. ..
} if xs.len() == 2 => { }) if xs.len() == 2 => {
definitions.remove(&generic); definitions.remove(&generic);
Data::Map( Data::Map(
xs.first() xs.first()
@ -314,6 +308,7 @@ impl Annotated<Schema> {
.to_owned(), .to_owned(),
) )
} }
_ => Data::List(Items::One(Declaration::Referenced(generic))), _ => Data::List(Items::One(Declaration::Referenced(generic))),
}; };

View File

@ -89,27 +89,29 @@ impl Validator {
let mut definitions = Definitions::new(); let mut definitions = Definitions::new();
let parameters = params
.iter()
.map(|param| {
Annotated::from_type(modules.into(), &param.tipo, &mut definitions)
.map(|schema| Parameter {
title: Some(param.arg_name.get_label()),
schema,
})
.map_err(|error| Error::Schema {
error,
location: param.location,
source_code: NamedSource::new(
module.input_path.display().to_string(),
module.code.clone(),
),
})
})
.collect::<Result<_, _>>()?;
Ok(Validator { Ok(Validator {
title: format!("{}.{}", &module.name, &func.name), title: format!("{}.{}", &module.name, &func.name),
description: None, description: func.doc.clone(),
parameters: params parameters,
.iter()
.map(|param| {
Annotated::from_type(modules.into(), &param.tipo, &mut definitions)
.map(|schema| Parameter {
title: Some(param.arg_name.get_label()),
schema,
})
.map_err(|error| Error::Schema {
error,
location: param.location,
source_code: NamedSource::new(
module.input_path.display().to_string(),
module.code.clone(),
),
})
})
.collect::<Result<_, _>>()?,
datum: datum datum: datum
.map(|datum| { .map(|datum| {
Annotated::from_type(modules.into(), &datum.tipo, &mut definitions).map_err( Annotated::from_type(modules.into(), &datum.tipo, &mut definitions).map_err(