mirror of
https://github.com/ProvableHQ/leo.git
synced 2024-12-26 11:45:00 +03:00
Merge pull request #1270 from AleoHQ/feature-clean-ast-snapshots
[Feature] Removes AST snapshots on leo clean
This commit is contained in:
commit
b3bcf1c6cf
@ -218,19 +218,19 @@ create_errors!(
|
||||
help: None,
|
||||
}
|
||||
|
||||
/// For when reading the prooving key failed.
|
||||
/// For when reading the proving key failed.
|
||||
@backtraced
|
||||
failed_to_read_proving_key_file {
|
||||
args: (path: impl Debug),
|
||||
msg: format!("Cannot read prooving key file from the provided file path - {:?}", path),
|
||||
msg: format!("Cannot read proving key file from the provided file path - {:?}", path),
|
||||
help: None,
|
||||
}
|
||||
|
||||
/// For when removing the prooving key file failed.
|
||||
/// For when removing the proving key file failed.
|
||||
@backtraced
|
||||
failed_to_remove_proving_key_file {
|
||||
args: (path: impl Debug),
|
||||
msg: format!("Cannot remove prooving key file from the provided file path - {:?}", path),
|
||||
msg: format!("Cannot remove proving key file from the provided file path - {:?}", path),
|
||||
help: None,
|
||||
}
|
||||
|
||||
@ -242,6 +242,22 @@ create_errors!(
|
||||
help: None,
|
||||
}
|
||||
|
||||
/// For when reading the snapshot file failed.
|
||||
@backtraced
|
||||
failed_to_read_snapshot_file {
|
||||
args: (path: impl Debug),
|
||||
msg: format!("Cannot read snapshot file from the provided file path - {:?}", path),
|
||||
help: None,
|
||||
}
|
||||
|
||||
/// For when removing the snapshot file failed.
|
||||
@backtraced
|
||||
failed_to_remove_snapshot_file {
|
||||
args: (path: impl Debug),
|
||||
msg: format!("Cannot remove snapshot file from the provided file path - {:?}", path),
|
||||
help: None,
|
||||
}
|
||||
|
||||
/// For when reading the verification key file failed.
|
||||
@backtraced
|
||||
failed_to_read_verification_key_file {
|
||||
|
@ -17,7 +17,9 @@
|
||||
use crate::{commands::Command, context::Context};
|
||||
use leo_compiler::OutputFile;
|
||||
use leo_errors::Result;
|
||||
use leo_package::outputs::{ChecksumFile, CircuitFile, ProofFile, ProvingKeyFile, VerificationKeyFile};
|
||||
use leo_package::outputs::{
|
||||
ChecksumFile, CircuitFile, ProofFile, ProvingKeyFile, Snapshot, SnapshotFile, VerificationKeyFile,
|
||||
};
|
||||
|
||||
use structopt::StructOpt;
|
||||
use tracing::span::Span;
|
||||
@ -61,6 +63,11 @@ impl Command for Clean {
|
||||
// Remove the proof from the output directory
|
||||
ProofFile::new(&package_name).remove(&path)?;
|
||||
|
||||
// Remove AST snapshots from the output directory
|
||||
SnapshotFile::new(&package_name, Snapshot::Initial).remove(&path)?;
|
||||
SnapshotFile::new(&package_name, Snapshot::TypeInference).remove(&path)?;
|
||||
SnapshotFile::new(&package_name, Snapshot::Canonicalization).remove(&path)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
103
package/src/outputs/ast_snapshot.rs
Normal file
103
package/src/outputs/ast_snapshot.rs
Normal file
@ -0,0 +1,103 @@
|
||||
// Copyright (C) 2019-2021 Aleo Systems Inc.
|
||||
// This file is part of the Leo library.
|
||||
|
||||
// The Leo library is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// The Leo library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
//! The serialized circuit output file.
|
||||
|
||||
use crate::outputs::OUTPUTS_DIRECTORY_NAME;
|
||||
use leo_errors::{PackageError, Result};
|
||||
|
||||
use serde::Deserialize;
|
||||
use std::{borrow::Cow, fmt, fs, path::Path};
|
||||
|
||||
/// Enum to handle all 3 types of snapshots.
|
||||
#[derive(Deserialize)]
|
||||
pub enum Snapshot {
|
||||
Initial,
|
||||
TypeInference,
|
||||
Canonicalization,
|
||||
}
|
||||
|
||||
impl fmt::Display for Snapshot {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
match self {
|
||||
Self::Initial => "initial_ast",
|
||||
Self::TypeInference => "type_inferenced_ast",
|
||||
Self::Canonicalization => "canonicalization_ast",
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
pub static AST_SNAPSHOT_FILE_EXTENSION: &str = ".json";
|
||||
|
||||
/// Generic Snapshot file wrapper. Each package can have up to 3
|
||||
/// different snapshots: initial_ast, canonicalization_ast and type_inferenced_ast;
|
||||
#[derive(Deserialize)]
|
||||
pub struct SnapshotFile {
|
||||
pub package_name: String,
|
||||
pub snapshot: Snapshot,
|
||||
}
|
||||
|
||||
impl SnapshotFile {
|
||||
pub fn new(package_name: &str, snapshot: Snapshot) -> Self {
|
||||
Self {
|
||||
package_name: package_name.to_string(),
|
||||
snapshot,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exists_at(&self, path: &Path) -> bool {
|
||||
let path = self.snapshot_file_path(path);
|
||||
path.exists()
|
||||
}
|
||||
|
||||
/// Reads the serialized circuit from the given file path if it exists.
|
||||
pub fn read_from(&self, path: &Path) -> Result<String> {
|
||||
let path = self.snapshot_file_path(path);
|
||||
|
||||
let result =
|
||||
fs::read_to_string(&path).map_err(|_| PackageError::failed_to_read_snapshot_file(path.into_owned()))?;
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
/// Removes the serialized circuit at the given path if it exists. Returns `true` on success,
|
||||
/// `false` if the file doesn't exist, and `Error` if the file system fails during operation.
|
||||
pub fn remove(&self, path: &Path) -> Result<bool> {
|
||||
let path = self.snapshot_file_path(path);
|
||||
if !path.exists() {
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
fs::remove_file(&path).map_err(|_| PackageError::failed_to_remove_snapshot_file(path.into_owned()))?;
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
fn snapshot_file_path<'a>(&self, path: &'a Path) -> Cow<'a, Path> {
|
||||
let mut path = Cow::from(path);
|
||||
if path.is_dir() {
|
||||
if !path.ends_with(OUTPUTS_DIRECTORY_NAME) {
|
||||
path.to_mut().push(OUTPUTS_DIRECTORY_NAME);
|
||||
}
|
||||
path.to_mut()
|
||||
.push(format!("{}{}", self.snapshot, AST_SNAPSHOT_FILE_EXTENSION));
|
||||
}
|
||||
path
|
||||
}
|
||||
}
|
@ -14,6 +14,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
pub mod ast_snapshot;
|
||||
pub use self::ast_snapshot::*;
|
||||
|
||||
pub mod circuit;
|
||||
pub use self::circuit::*;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user