pub mod whiley;
pub mod quickcheck;
pub mod javascript;
pub mod boogie;
use std::error;
use std::fmt;
use std::collections::HashMap;
use std::path::Path;
use crate::build;
use crate::config;
use crate::config::{Config};
pub enum Instance {
Java(Box<dyn JavaInstance>),
Rust(Box<dyn RustInstance>)
}
impl Instance {
pub fn manifest(&self) -> Vec<build::Artifact> {
match self {
Instance::Java(i) => i.manifest(),
Instance::Rust(i) => i.manifest()
}
}
}
pub trait JavaInstance {
fn name(&self) -> &'static str;
fn dependencies(&self) -> &[&str];
fn arguments(&self) -> Vec<String>;
fn manifest(&self) -> Vec<build::Artifact>;
fn process(&self,output:&str) -> Result<Vec<build::Marker>,Box<dyn error::Error>>;
}
pub trait RustInstance {
fn name(&self) -> &'static str;
fn manifest(&self) -> Vec<build::Artifact>;
}
#[derive(Clone)]
pub struct PluginError {
name: String,
message: String
}
impl fmt::Display for PluginError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: {}",self.name,self.message)
}
}
impl fmt::Debug for PluginError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: {}",self.name,self.message)
}
}
impl error::Error for PluginError {}
pub trait Descriptor {
fn apply<'a>(&self, config: &'a Config, whileypath: &'a Path)->Result<Instance,config::Error>;
}
pub struct Registry<'a> {
registry: HashMap<&'a str, &'a dyn Descriptor>
}
impl<'a> Registry<'a> {
pub fn new() -> Registry<'a> {
Registry{registry: HashMap::new()}
}
pub fn register(&mut self, name: &'a str, desc : &'a dyn Descriptor) {
self.registry.insert(name,desc);
}
pub fn get(&self, name: &str) -> Option<&'a dyn Descriptor> {
match self.registry.get(name) {
None => None,
Some(&v) => Some(v)
}
}
}