feat(export): implement basic command functionality
This commit is contained in:
parent
b63bd9b9e0
commit
7d67f1497c
|
@ -120,6 +120,9 @@ pub enum Error {
|
||||||
|
|
||||||
#[error("I found multiple suitable validators and I need you to tell me which one to pick.")]
|
#[error("I found multiple suitable validators and I need you to tell me which one to pick.")]
|
||||||
MoreThanOneValidatorFound { known_validators: Vec<String> },
|
MoreThanOneValidatorFound { known_validators: Vec<String> },
|
||||||
|
|
||||||
|
#[error("I couldn't find any exportable function named '{name}' in module '{module}'.")]
|
||||||
|
ExportNotFound { module: String, name: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Error {
|
impl Error {
|
||||||
|
@ -177,27 +180,28 @@ impl From<Error> for Vec<Error> {
|
||||||
impl ExtraData for Error {
|
impl ExtraData for Error {
|
||||||
fn extra_data(&self) -> Option<String> {
|
fn extra_data(&self) -> Option<String> {
|
||||||
match self {
|
match self {
|
||||||
Error::DuplicateModule { .. } => None,
|
Error::DuplicateModule { .. }
|
||||||
Error::FileIo { .. } => None,
|
| Error::FileIo { .. }
|
||||||
Error::Format { .. } => None,
|
| Error::Format { .. }
|
||||||
Error::StandardIo { .. } => None,
|
| Error::StandardIo { .. }
|
||||||
Error::Blueprint { .. } => None,
|
| Error::Blueprint { .. }
|
||||||
Error::MissingManifest { .. } => None,
|
| Error::MissingManifest { .. }
|
||||||
Error::TomlLoading { .. } => None,
|
| Error::TomlLoading { .. }
|
||||||
Error::ImportCycle { .. } => None,
|
| Error::ImportCycle { .. }
|
||||||
Error::Parse { .. } => None,
|
| Error::Parse { .. }
|
||||||
|
| Error::TestFailure { .. }
|
||||||
|
| Error::Http { .. }
|
||||||
|
| Error::ZipExtract { .. }
|
||||||
|
| Error::JoinError { .. }
|
||||||
|
| Error::UnknownPackageVersion { .. }
|
||||||
|
| Error::UnableToResolvePackage { .. }
|
||||||
|
| Error::Json { .. }
|
||||||
|
| Error::MalformedStakeAddress { .. }
|
||||||
|
| Error::NoValidatorNotFound { .. }
|
||||||
|
| Error::MoreThanOneValidatorFound { .. }
|
||||||
|
| Error::Module { .. }
|
||||||
|
| Error::ExportNotFound { .. } => None,
|
||||||
Error::Type { error, .. } => error.extra_data(),
|
Error::Type { error, .. } => error.extra_data(),
|
||||||
Error::TestFailure { .. } => None,
|
|
||||||
Error::Http { .. } => None,
|
|
||||||
Error::ZipExtract { .. } => None,
|
|
||||||
Error::JoinError { .. } => None,
|
|
||||||
Error::UnknownPackageVersion { .. } => None,
|
|
||||||
Error::UnableToResolvePackage { .. } => None,
|
|
||||||
Error::Json { .. } => None,
|
|
||||||
Error::MalformedStakeAddress { .. } => None,
|
|
||||||
Error::NoValidatorNotFound { .. } => None,
|
|
||||||
Error::MoreThanOneValidatorFound { .. } => None,
|
|
||||||
Error::Module { .. } => None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -210,53 +214,55 @@ pub trait GetSource {
|
||||||
impl GetSource for Error {
|
impl GetSource for Error {
|
||||||
fn path(&self) -> Option<PathBuf> {
|
fn path(&self) -> Option<PathBuf> {
|
||||||
match self {
|
match self {
|
||||||
Error::DuplicateModule { second, .. } => Some(second.to_path_buf()),
|
Error::FileIo { .. }
|
||||||
Error::FileIo { .. } => None,
|
| Error::Format { .. }
|
||||||
Error::Format { .. } => None,
|
| Error::StandardIo(_)
|
||||||
Error::StandardIo(_) => None,
|
| Error::Blueprint(_)
|
||||||
Error::Blueprint(_) => None,
|
| Error::ImportCycle { .. }
|
||||||
Error::MissingManifest { path } => Some(path.to_path_buf()),
|
| Error::Http(_)
|
||||||
Error::TomlLoading { path, .. } => Some(path.to_path_buf()),
|
| Error::ZipExtract(_)
|
||||||
Error::ImportCycle { .. } => None,
|
| Error::JoinError(_)
|
||||||
Error::Parse { path, .. } => Some(path.to_path_buf()),
|
| Error::UnknownPackageVersion { .. }
|
||||||
Error::Type { path, .. } => Some(path.to_path_buf()),
|
| Error::UnableToResolvePackage { .. }
|
||||||
Error::TestFailure { path, .. } => Some(path.to_path_buf()),
|
| Error::Json { .. }
|
||||||
Error::Http(_) => None,
|
| Error::MalformedStakeAddress { .. }
|
||||||
Error::ZipExtract(_) => None,
|
| Error::NoValidatorNotFound { .. }
|
||||||
Error::JoinError(_) => None,
|
| Error::MoreThanOneValidatorFound { .. }
|
||||||
Error::UnknownPackageVersion { .. } => None,
|
| Error::ExportNotFound { .. }
|
||||||
Error::UnableToResolvePackage { .. } => None,
|
| Error::Module { .. } => None,
|
||||||
Error::Json { .. } => None,
|
Error::DuplicateModule { second: path, .. }
|
||||||
Error::MalformedStakeAddress { .. } => None,
|
| Error::MissingManifest { path }
|
||||||
Error::NoValidatorNotFound { .. } => None,
|
| Error::TomlLoading { path, .. }
|
||||||
Error::MoreThanOneValidatorFound { .. } => None,
|
| Error::Parse { path, .. }
|
||||||
Error::Module { .. } => None,
|
| Error::Type { path, .. }
|
||||||
|
| Error::TestFailure { path, .. } => Some(path.to_path_buf()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn src(&self) -> Option<String> {
|
fn src(&self) -> Option<String> {
|
||||||
match self {
|
match self {
|
||||||
Error::DuplicateModule { .. } => None,
|
Error::DuplicateModule { .. }
|
||||||
Error::FileIo { .. } => None,
|
| Error::FileIo { .. }
|
||||||
Error::Format { .. } => None,
|
| Error::Format { .. }
|
||||||
Error::StandardIo(_) => None,
|
| Error::StandardIo(_)
|
||||||
Error::Blueprint(_) => None,
|
| Error::Blueprint(_)
|
||||||
Error::MissingManifest { .. } => None,
|
| Error::MissingManifest { .. }
|
||||||
Error::TomlLoading { src, .. } => Some(src.to_string()),
|
| Error::ImportCycle { .. }
|
||||||
Error::ImportCycle { .. } => None,
|
| Error::TestFailure { .. }
|
||||||
Error::Parse { src, .. } => Some(src.to_string()),
|
| Error::Http(_)
|
||||||
Error::Type { src, .. } => Some(src.to_string()),
|
| Error::ZipExtract(_)
|
||||||
Error::TestFailure { .. } => None,
|
| Error::JoinError(_)
|
||||||
Error::Http(_) => None,
|
| Error::UnknownPackageVersion { .. }
|
||||||
Error::ZipExtract(_) => None,
|
| Error::UnableToResolvePackage { .. }
|
||||||
Error::JoinError(_) => None,
|
| Error::Json { .. }
|
||||||
Error::UnknownPackageVersion { .. } => None,
|
| Error::MalformedStakeAddress { .. }
|
||||||
Error::UnableToResolvePackage { .. } => None,
|
| Error::NoValidatorNotFound { .. }
|
||||||
Error::Json { .. } => None,
|
| Error::MoreThanOneValidatorFound { .. }
|
||||||
Error::MalformedStakeAddress { .. } => None,
|
| Error::ExportNotFound { .. }
|
||||||
Error::NoValidatorNotFound { .. } => None,
|
| Error::Module { .. } => None,
|
||||||
Error::MoreThanOneValidatorFound { .. } => None,
|
Error::TomlLoading { src, .. } | Error::Parse { src, .. } | Error::Type { src, .. } => {
|
||||||
Error::Module { .. } => None,
|
Some(src.to_string())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,6 +311,7 @@ impl Diagnostic for Error {
|
||||||
Error::MalformedStakeAddress { .. } => None,
|
Error::MalformedStakeAddress { .. } => None,
|
||||||
Error::NoValidatorNotFound { .. } => None,
|
Error::NoValidatorNotFound { .. } => None,
|
||||||
Error::MoreThanOneValidatorFound { .. } => None,
|
Error::MoreThanOneValidatorFound { .. } => None,
|
||||||
|
Error::ExportNotFound { .. } => None,
|
||||||
Error::Module(e) => e.code().map(boxed),
|
Error::Module(e) => e.code().map(boxed),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -334,6 +341,7 @@ impl Diagnostic for Error {
|
||||||
Error::Http(_) => None,
|
Error::Http(_) => None,
|
||||||
Error::ZipExtract(_) => None,
|
Error::ZipExtract(_) => None,
|
||||||
Error::JoinError(_) => None,
|
Error::JoinError(_) => None,
|
||||||
|
Error::ExportNotFound { .. } => None,
|
||||||
Error::UnknownPackageVersion { .. } => Some(Box::new(
|
Error::UnknownPackageVersion { .. } => Some(Box::new(
|
||||||
"Perhaps, double-check the package repository and version?",
|
"Perhaps, double-check the package repository and version?",
|
||||||
)),
|
)),
|
||||||
|
@ -379,6 +387,7 @@ impl Diagnostic for Error {
|
||||||
Error::DuplicateModule { .. } => None,
|
Error::DuplicateModule { .. } => None,
|
||||||
Error::FileIo { .. } => None,
|
Error::FileIo { .. } => None,
|
||||||
Error::ImportCycle { .. } => None,
|
Error::ImportCycle { .. } => None,
|
||||||
|
Error::ExportNotFound { .. } => None,
|
||||||
Error::Blueprint(e) => e.labels(),
|
Error::Blueprint(e) => e.labels(),
|
||||||
Error::Parse { error, .. } => error.labels(),
|
Error::Parse { error, .. } => error.labels(),
|
||||||
Error::MissingManifest { .. } => None,
|
Error::MissingManifest { .. } => None,
|
||||||
|
@ -413,6 +422,7 @@ impl Diagnostic for Error {
|
||||||
Error::DuplicateModule { .. } => None,
|
Error::DuplicateModule { .. } => None,
|
||||||
Error::FileIo { .. } => None,
|
Error::FileIo { .. } => None,
|
||||||
Error::ImportCycle { .. } => None,
|
Error::ImportCycle { .. } => None,
|
||||||
|
Error::ExportNotFound { .. } => None,
|
||||||
Error::Blueprint(e) => e.source_code(),
|
Error::Blueprint(e) => e.source_code(),
|
||||||
Error::Parse { named, .. } => Some(named),
|
Error::Parse { named, .. } => Some(named),
|
||||||
Error::Type { named, .. } => Some(named),
|
Error::Type { named, .. } => Some(named),
|
||||||
|
@ -439,6 +449,7 @@ impl Diagnostic for Error {
|
||||||
Error::DuplicateModule { .. } => None,
|
Error::DuplicateModule { .. } => None,
|
||||||
Error::FileIo { .. } => None,
|
Error::FileIo { .. } => None,
|
||||||
Error::ImportCycle { .. } => None,
|
Error::ImportCycle { .. } => None,
|
||||||
|
Error::ExportNotFound { .. } => None,
|
||||||
Error::Blueprint(e) => e.url(),
|
Error::Blueprint(e) => e.url(),
|
||||||
Error::Parse { .. } => None,
|
Error::Parse { .. } => None,
|
||||||
Error::Type { error, .. } => error.url(),
|
Error::Type { error, .. } => error.url(),
|
||||||
|
@ -464,6 +475,7 @@ impl Diagnostic for Error {
|
||||||
match self {
|
match self {
|
||||||
Error::DuplicateModule { .. } => None,
|
Error::DuplicateModule { .. } => None,
|
||||||
Error::FileIo { .. } => None,
|
Error::FileIo { .. } => None,
|
||||||
|
Error::ExportNotFound { .. } => None,
|
||||||
Error::Blueprint(e) => e.related(),
|
Error::Blueprint(e) => e.related(),
|
||||||
Error::ImportCycle { .. } => None,
|
Error::ImportCycle { .. } => None,
|
||||||
Error::Parse { .. } => None,
|
Error::Parse { .. } => None,
|
||||||
|
|
|
@ -464,6 +464,47 @@ where
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn export(&self, module: &str, name: &str) -> Result<String, Error> {
|
||||||
|
let mut generator = self.checked_modules.new_generator(
|
||||||
|
&self.functions,
|
||||||
|
&self.data_types,
|
||||||
|
&self.module_types,
|
||||||
|
Tracing::silent(),
|
||||||
|
);
|
||||||
|
|
||||||
|
self.checked_modules
|
||||||
|
.get(module)
|
||||||
|
.and_then(|checked_module| {
|
||||||
|
checked_module.ast.definitions().find_map(|def| match def {
|
||||||
|
Definition::Fn(func) if func.name == name => {
|
||||||
|
let typed_anon = TypedExpr::Fn {
|
||||||
|
location: Span::empty(),
|
||||||
|
tipo: function(
|
||||||
|
func.arguments.iter().map(|arg| arg.tipo.clone()).collect(),
|
||||||
|
func.return_type.clone(),
|
||||||
|
),
|
||||||
|
is_capture: false,
|
||||||
|
args: func.arguments.clone(),
|
||||||
|
body: func.body.clone().into(),
|
||||||
|
return_annotation: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
Some(typed_anon)
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.map(|body| {
|
||||||
|
let program = generator.generate_test(&body, &name.to_string());
|
||||||
|
|
||||||
|
program.to_pretty()
|
||||||
|
})
|
||||||
|
.ok_or_else(|| Error::ExportNotFound {
|
||||||
|
module: module.to_string(),
|
||||||
|
name: name.to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn construct_parameter_incrementally<F>(
|
pub fn construct_parameter_incrementally<F>(
|
||||||
&self,
|
&self,
|
||||||
title: Option<&String>,
|
title: Option<&String>,
|
||||||
|
|
|
@ -5,6 +5,15 @@ pub struct Options {
|
||||||
pub tracing: Tracing,
|
pub tracing: Tracing,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Options {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
code_gen_mode: CodeGenMode::NoOp,
|
||||||
|
tracing: Tracing::silent(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub enum CodeGenMode {
|
pub enum CodeGenMode {
|
||||||
Test {
|
Test {
|
||||||
match_tests: Option<Vec<String>>,
|
match_tests: Option<Vec<String>>,
|
||||||
|
|
|
@ -1,14 +1,36 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use aiken_project::{options::Options, watch::with_project};
|
||||||
|
|
||||||
#[derive(clap::Args)]
|
#[derive(clap::Args)]
|
||||||
pub struct Args {
|
pub struct Args {
|
||||||
/// Name of the validator's module within the project. Optional if there's only one validator
|
/// Path to project
|
||||||
|
directory: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Name of the function's module within the project
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
module: String,
|
module: String,
|
||||||
|
|
||||||
/// Name of the validator within the module. Optional if there's only one validator
|
/// Name of the function within the module
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
name: String,
|
name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exec(args: Args) -> miette::Result<()> {
|
pub fn exec(
|
||||||
|
Args {
|
||||||
|
directory,
|
||||||
|
module,
|
||||||
|
name,
|
||||||
|
}: Args,
|
||||||
|
) -> miette::Result<()> {
|
||||||
|
with_project(directory.as_deref(), false, |p| {
|
||||||
|
p.compile(Options::default())?;
|
||||||
|
|
||||||
|
let raw_uplc = p.export(&module, &name)?;
|
||||||
|
|
||||||
|
println!("{}", raw_uplc);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
})
|
||||||
|
.map_err(|_| std::process::exit(1))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue