rust_to_npm/
lib.rs

1extern crate serde_derive;
2extern crate toml;
3
4pub mod generators;
5
6use crate::generators::{package, pre_install, start, uninstall};
7
8use std::env;
9use std::fs::OpenOptions;
10use std::fs::{read_to_string, File};
11use std::io::prelude::*;
12use std::path::Path;
13
14use serde_derive::Deserialize;
15
16#[derive(Deserialize, Debug, Default)]
17/// package def for npm from cargo
18pub struct Package {
19    /// the package name
20    pub name: String,
21    /// the version of the package
22    pub version: String,
23    /// what the package is about.
24    pub description: Option<String>,
25    /// github repo url
26    pub repository: Option<String>,
27    /// keywords for package
28    pub keywords: Option<Vec<String>>,
29    /// the authors of the package
30    pub authors: Option<Vec<String>>,
31    /// the package home page
32    pub homepage: Option<String>,
33    /// the license type
34    pub license: Option<String>,
35    /// publish the package to crates.io and npm?
36    pub publish: Option<bool>,
37}
38
39#[derive(Deserialize, Debug, Default)]
40/// the Cargo.toml definition
41pub struct CargoToml {
42    /// the package
43    pub package: Package,
44}
45
46/// create or get a file ready for writting.
47pub fn ready_write_file(name: &str) -> File {
48    OpenOptions::new()
49        .write(true)
50        .truncate(true)
51        .create(true)
52        .open(&name)
53        .expect("Unable to open {name}")
54}
55
56/// convert Cargo.toml to Package structure
57pub fn get_package_def() -> Package {
58    let cargo_toml = format!("{}{}", env::current_dir().unwrap().display(), "/Cargo.toml");
59    let cargo_toml = Path::new(&cargo_toml);
60
61    let cargo_file: String = read_to_string(cargo_toml).unwrap();
62    let cargo_toml: CargoToml = toml::from_str(&cargo_file).unwrap();
63    let package_def: Package = cargo_toml.package;
64
65    package_def
66}
67
68/// create npm package contents based off Cargo.toml
69pub fn create_package(npm_package_name: &Option<String>, source: &bool) -> Package {
70    println!("Building contents...");
71    // npm package scripts
72    let package_json = "./package.json";
73    let pre_install = "./pre-install.js";
74    let uninstall = "./uninstall.js";
75    let start = "./start.js";
76
77    let mut package_json_file = ready_write_file(&package_json);
78    let mut pre_install_file = ready_write_file(&pre_install);
79    let mut start_file = ready_write_file(&start);
80    let mut uninstall_file = ready_write_file(&uninstall);
81
82    let cargo_toml = format!("{}{}", env::current_dir().unwrap().display(), "/Cargo.toml");
83    let cargo_toml = Path::new(&cargo_toml);
84
85    let cargo_file: String = read_to_string(cargo_toml).unwrap();
86    let cargo_toml: CargoToml = toml::from_str(&cargo_file).unwrap();
87    let mut package_def: Package = cargo_toml.package;
88
89    let name = package_def.name.clone();
90    let pkg_name = npm_package_name.as_ref().unwrap_or(&name);
91
92    package_def.name = pkg_name.to_string();
93
94    package_json_file
95        .write_all(&package::generate_package_json(&mut package_def, source).as_bytes())
96        .unwrap();
97    pre_install_file
98        .write_all(
99            &pre_install::generate_pre_install(&name, &package_def.version, source).as_bytes(),
100        )
101        .unwrap();
102    start_file
103        .write_all(&start::generate_start(&name).as_bytes())
104        .unwrap();
105    uninstall_file
106        .write_all(&uninstall::generate_uninstall(&name).as_bytes())
107        .unwrap();
108
109    package_json_file.flush().unwrap();
110    start_file.flush().unwrap();
111    pre_install_file.flush().unwrap();
112    uninstall_file.flush().unwrap();
113
114    println!("Finished creating modules for package.");
115
116    package_def
117}