Added platform trait and specific platforms implementations plust HostPlatform to provide common api

This commit is contained in:
Manoj Ghimire 2022-03-20 11:38:34 -04:00
parent bbca606f56
commit d07bc6a4b8
2 changed files with 50 additions and 9 deletions

View File

@ -5,6 +5,8 @@
#![deny(missing_docs)]
mod platform;
use std::{
collections::{HashMap, HashSet},
ffi::OsStr,
@ -18,6 +20,8 @@ use std::{
use notify::Watcher as _;
use thiserror::Error;
use self::platform::HostPlatform;
/// Represents a Fornjot model
pub struct Model {
src_path: PathBuf,
@ -47,15 +51,7 @@ impl Model {
let src_path = path.join("src");
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)
};
let file = HostPlatform::host_file_name(&name);
let target_dir = target_dir.unwrap_or_else(|| path.join("target"));
target_dir.join("debug").join(file)
};

45
fj-host/src/platform.rs Normal file
View File

@ -0,0 +1,45 @@
// Represents platform trait
trait Platform {
fn file_name(name: &str) -> String;
}
// Represents all platforms supported
// Mac OS
struct Macos;
// Windows
struct Windows;
// Linux
struct Unix;
impl Platform for Windows {
fn file_name(name: &str) -> String {
format!("{}.dll", name)
}
}
impl Platform for Macos {
fn file_name(name: &str) -> String {
format!("lib{}.dylib", name)
}
}
impl Platform for Unix {
fn file_name(name: &str) -> String {
format!("lib{}.so", name)
}
}
// Represents common apis availiable independent of hosts
pub struct HostPlatform;
impl HostPlatform {
pub fn host_file_name(name: &str) -> String {
if cfg!(windows) {
Windows::file_name(name)
} else if cfg!(target_os = "macos") {
Macos::file_name(name)
} else {
//Unix
Unix::file_name(name)
}
}
}