mirror of
https://github.com/hannobraun/Fornjot
synced 2025-02-26 17:15:52 +00:00
Compute all Model
paths in constructor
This is both simpler, and opens the door for using `Model` in more flexible ways.
This commit is contained in:
parent
f094ce41d9
commit
31926784f3
@ -57,7 +57,7 @@ fn main() -> anyhow::Result<()> {
|
|||||||
let mut path = config.default_path;
|
let mut path = config.default_path;
|
||||||
path.push(args.model.unwrap_or(config.default_model));
|
path.push(args.model.unwrap_or(config.default_model));
|
||||||
|
|
||||||
let model = Model::from_path(path);
|
let model = Model::from_path(path)?;
|
||||||
|
|
||||||
let mut parameters = HashMap::new();
|
let mut parameters = HashMap::new();
|
||||||
for parameter in args.parameters {
|
for parameter in args.parameters {
|
||||||
|
73
src/model.rs
73
src/model.rs
@ -1,60 +1,57 @@
|
|||||||
use std::{
|
use std::{collections::HashMap, io, path::PathBuf, process::Command};
|
||||||
collections::HashMap,
|
|
||||||
io,
|
|
||||||
path::{Path, PathBuf},
|
|
||||||
process::Command,
|
|
||||||
};
|
|
||||||
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
pub struct Model {
|
pub struct Model {
|
||||||
path: PathBuf,
|
src_path: PathBuf,
|
||||||
|
lib_path: PathBuf,
|
||||||
|
manifest_path: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Model {
|
impl Model {
|
||||||
pub fn from_path(path: PathBuf) -> Self {
|
pub fn from_path(path: PathBuf) -> Result<Self, io::Error> {
|
||||||
Self { path }
|
let name = {
|
||||||
}
|
// Can't panic. It only would, if the path ends with "..", and we
|
||||||
|
// are canonicalizing it here to prevent that.
|
||||||
|
let canonical = path.canonicalize()?;
|
||||||
|
let file_name = canonical.file_name().unwrap();
|
||||||
|
|
||||||
pub fn name(&self) -> Result<String, io::Error> {
|
file_name.to_string_lossy().replace('-', "_")
|
||||||
let canonical = self.path.canonicalize()?;
|
};
|
||||||
|
|
||||||
// Can't panic. It only would, if the path ends with "..", and we just
|
let src_path = path.join("src");
|
||||||
// canonicalized it.
|
|
||||||
let file_name = canonical.file_name().unwrap();
|
|
||||||
|
|
||||||
Ok(file_name.to_string_lossy().into_owned())
|
let lib_path = {
|
||||||
}
|
let file = if cfg!(windows) {
|
||||||
|
format!("{}.dll", name)
|
||||||
|
} else if cfg!(target_os = "macos") {
|
||||||
|
format!("lib{}.dylib", name)
|
||||||
|
} else {
|
||||||
|
//Unix
|
||||||
|
format!("lib{}.so", name)
|
||||||
|
};
|
||||||
|
|
||||||
pub fn path(&self) -> &Path {
|
path.join("target/debug").join(file)
|
||||||
&self.path
|
};
|
||||||
|
|
||||||
|
let manifest_path = path.join("Cargo.toml");
|
||||||
|
|
||||||
|
Ok(Self {
|
||||||
|
src_path,
|
||||||
|
lib_path,
|
||||||
|
manifest_path,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn src_path(&self) -> PathBuf {
|
pub fn src_path(&self) -> PathBuf {
|
||||||
self.path().join("src")
|
self.src_path.clone()
|
||||||
}
|
|
||||||
|
|
||||||
pub fn lib_path(&self) -> Result<PathBuf, io::Error> {
|
|
||||||
let name = self.name()?.replace('-', "_");
|
|
||||||
|
|
||||||
let file = if cfg!(windows) {
|
|
||||||
format!("{}.dll", name)
|
|
||||||
} else if cfg!(target_os = "macos") {
|
|
||||||
format!("lib{}.dylib", name)
|
|
||||||
} else {
|
|
||||||
//Unix
|
|
||||||
format!("lib{}.so", name)
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(self.path().join("target/debug").join(file))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load(
|
pub fn load(
|
||||||
&self,
|
&self,
|
||||||
arguments: &HashMap<String, String>,
|
arguments: &HashMap<String, String>,
|
||||||
) -> Result<fj::Shape, Error> {
|
) -> Result<fj::Shape, Error> {
|
||||||
let manifest_path =
|
let manifest_path = self.manifest_path.display().to_string();
|
||||||
self.path().join("Cargo.toml").display().to_string();
|
|
||||||
|
|
||||||
let status = Command::new("cargo")
|
let status = Command::new("cargo")
|
||||||
.arg("build")
|
.arg("build")
|
||||||
@ -82,7 +79,7 @@ impl Model {
|
|||||||
// to switch to a better technique:
|
// to switch to a better technique:
|
||||||
// https://github.com/hannobraun/Fornjot/issues/71
|
// https://github.com/hannobraun/Fornjot/issues/71
|
||||||
let shape = unsafe {
|
let shape = unsafe {
|
||||||
let lib = libloading::Library::new(self.lib_path()?)?;
|
let lib = libloading::Library::new(&self.lib_path)?;
|
||||||
let model: libloading::Symbol<ModelFn> = lib.get(b"model")?;
|
let model: libloading::Symbol<ModelFn> = lib.get(b"model")?;
|
||||||
model(arguments)
|
model(arguments)
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user