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)]
17pub struct Package {
19 pub name: String,
21 pub version: String,
23 pub description: Option<String>,
25 pub repository: Option<String>,
27 pub keywords: Option<Vec<String>>,
29 pub authors: Option<Vec<String>>,
31 pub homepage: Option<String>,
33 pub license: Option<String>,
35 pub publish: Option<bool>,
37}
38
39#[derive(Deserialize, Debug, Default)]
40pub struct CargoToml {
42 pub package: Package,
44}
45
46pub 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
56pub 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
68pub fn create_package(npm_package_name: &Option<String>, source: &bool) -> Package {
70 println!("Building contents...");
71 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}