interoptopus_csharp 0.16.0-alpha.17

The C# backend for Interoptopus.
Documentation
mod csharp;
#[cfg(any(feature = "unstable-plugins", docsrs))]
mod dotnet;
mod rust;

use crate::Error;
use crate::pass::{ModelResult, Outcome};
#[cfg(any(feature = "unstable-plugins", docsrs))]
pub use dotnet::{DotnetLibrary, DotnetLibraryBuilder, DotnetLibraryConfig, IntermediateOutputPasses as DotnetOutputPasses, ModelPasses as DotnetModelPasses};
pub use rust::{IntermediateOutputPasses, ModelPasses, RustLibrary, RustLibraryBuilder, RustLibraryConfig};

pub struct PassRunner {
    outcome: Outcome,
}

impl PassRunner {
    pub fn new() -> Self {
        Self { outcome: Outcome::Unchanged }
    }

    pub fn run(&mut self, x: ModelResult) -> Result<(), Error> {
        match x {
            Ok(Outcome::Changed) => self.outcome.changed(),
            Ok(Outcome::Unchanged) => {}
            Err(e) => return Err(e),
        }
        Ok(())
    }
}

pub fn loop_model_passes_until_done(mut f: impl FnMut(&mut PassRunner) -> Result<(), Error>) -> Result<(), Error> {
    const PASS_LIMIT: u32 = 100;
    let mut counter = 0;

    loop {
        let mut pass_runner = PassRunner::new();

        f(&mut pass_runner)?;

        if pass_runner.outcome == Outcome::Unchanged {
            break;
        }

        counter += 1;
        if counter > PASS_LIMIT {
            return Err(Error::from("Pass iteration limit reached."));
        }
    }
    Ok(())
}