├── .gitignore
├── images
└── cakecutter.png
├── Cargo.toml
├── Cake.toml
├── examples
└── Python.toml
├── README.md
├── src
└── main.rs
└── Cargo.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | target/
2 | Cargo.lock
--------------------------------------------------------------------------------
/images/cakecutter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dhravya/Cakecutter/HEAD/images/cakecutter.png
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "cakecutter"
3 | version = "0.1.0"
4 | edition = "2021"
5 | license = "MIT"
6 | description = "Cakecutter is a utility tool to help you create new projects quickly, from pre-built cakes"
7 |
8 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
9 |
10 | [dependencies]
11 | toml = "0.5.8"
12 | ureq = "0.1.1"
--------------------------------------------------------------------------------
/Cake.toml:
--------------------------------------------------------------------------------
1 | # This is the Cakefile for this project.
2 | # Feel free to add Cakefiles to your own projects!
3 |
4 | [metadata]
5 | name = "Cakecutter"
6 | version = "0.1.0"
7 | description = "Cakecutter template (For rust)"
8 | author = "Dhravya Shah"
9 | author_email = "hello@dhravya.dev"
10 |
11 | [filestructure]
12 | root = [".gitignore", "Cargo.toml", "README.md", "LICENSE"]
13 | examples = ["Python.toml"]
14 | src = ["main.rs"]
15 |
16 | # If you want to, you can literally write all the content here in one file but then what's the point of a "template" lol
17 | [content]
18 | Cargo-toml = """
19 | [package]
20 | name = "cakecutter"
21 | version = "0.1.0"
22 | edition = "2021"
23 |
24 | [dependencies]
25 | toml = "0.5.8"
26 | """
27 |
28 | [commands]
29 | # Commands are run every time a new project is created.
30 | 1 = ["cargo", "install"]
--------------------------------------------------------------------------------
/examples/Python.toml:
--------------------------------------------------------------------------------
1 | [metadata]
2 | # Metadata is optional for every project. Its just to help keep track of who made what
3 | name = "Python CakeCutter"
4 | version = "0.1.0"
5 | description = "Builds a Python project from a template"
6 | author = "Dhravya Shah"
7 | author_email = "hello@dhravya.dev"
8 |
9 | # This is an example to show how a python project can be set up
10 | [filestructure]
11 | root = ['.gitignore', '.env', 'requirements.txt', 'README.md', 'LICENSE']
12 | src = ['main.py']
13 | # TODO: add support for dots in directory name (.github)
14 |
15 | [content]
16 | src--main-py = """
17 | print("Hello World")
18 | """
19 |
20 | -gitignore = """
21 | target/
22 | .env
23 | venv/
24 | """
25 |
26 | LICENSE = """
27 | Whatever license you want here
28 | """
29 |
30 | requirements-txt = """requests"""
31 |
32 | [commands]
33 | 1 = ['python', '-m', 'venv', 'venv']
34 | 2 = ['pip', 'install', '-r', 'requirements.txt']
35 | 3 = ['python', 'src/main.py']
36 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |

3 |
Cakecutter
4 |
5 | Create projects from pre-built cakes (templates)! Supports files, packages, content, running commands and more!
6 |
7 |
8 | ***
9 |
10 | Cakecutter is a utility tool that quickly sets up a project from a pre-built template.
11 |
12 | All template files are in `.toml` format, which means they are easy to edit and share with others.
13 |
14 | Here's a python project demo
15 |
16 | Notice how it created the files and ran the VENV command to initialise the virtual environment, and started installing the dependencies
17 | 
18 |
19 | ## Features
20 | - Create projects from pre-built cakes (templates) and make your own!
21 | - Supports all languages (Python, Js, Rust, Go, you name it.)
22 | - Cross-platform
23 | - Super fast ⚡
24 | - Get Cakes from github or use local Cakefiles
25 |
26 | ### Installation
27 | ```
28 | cargo install cakecutter
29 | ```
30 |
31 | ### Usage
32 | ```
33 | cakecutter [TEMPLATE_NAME]
34 | ```
35 | You can also use cakes from github (Provided they have a `Cake.toml` file in the root directory of the repository):
36 | ```
37 | cakecutter https://github.com/dhravya/cakecutter
38 | ```
39 |
40 | ## Making your own Cakefile
41 | It's really easy to make your own cakefile. There are 4 main sections:
42 | ```toml
43 | [metadata]
44 |
45 | [filestructure]
46 |
47 | [content]
48 |
49 | [commands]
50 | ```
51 |
52 | ### Basic rules
53 | Since TOML doesn't support `.` and `/` as keys, we use `-` and `--` instead.
54 |
55 | so instead of `main.py`, we use `main-py` and instead of `src/main.py` we use `src--main-py`
56 |
57 | #### Metadata
58 | Metadata is optional, but when you include it, make sure to include the following:
59 | - `name`: The name of your cake
60 | - `version`: Cake version
61 | - `description`: What the cake is for
62 | - `author`: The author of Cake
63 |
64 | #### File structure
65 | The file structure is where you define the structure of your project.
66 |
67 | To include files in the current directory, put them in the `root` list
68 | `root = [".gitignore", "Cargo.toml", "README.md", "LICENSE"]`
69 |
70 | For every other directory, use the following syntax:
71 | `directory_name = [file1, file2]`
72 | So for this repository, it looks something like
73 | ```toml
74 | root = [".gitignore", "Cargo.toml", "README.md", "LICENSE"]
75 | examples = ["Python.toml"]
76 | ```
77 |
78 | #### Content
79 | Content is where you define the content of your files.
80 | It's pretty simple, just write the name of file (following the basic rules) and the content of the files after it
81 | ```toml
82 | [content]
83 | src--main-py = """
84 | print("Hello World")
85 | """
86 | ```
87 | This will fill in the file `src/main.py` with the content of the string.
88 |
89 | #### Commands
90 | These are the commands that run when a cake is made (Stuff like installing dependencies)
91 |
92 | All keys here should be numbers starting from one and increasing progressively.
93 |
94 | Commands should be written as if written in a Dockerfile
95 |
96 | Here's an examples:
97 | ```toml
98 | [commands]
99 | 1 = ['python', '-m', 'venv', 'venv']
100 | 2 = ['pip', 'install', '-r', 'requirements.txt']
101 | 3 = ['python', 'src/main.py']
102 | ```
103 |
104 |
105 | ### License
106 | This project is licensed under the mit license
107 | ### Show your support
108 | Leave a ⭐ if you like this project
109 |
110 | ***
111 | Readme made with 💖 using [README Generator by Dhravya Shah](https://github.com/Dhravya/readme-generator)
--------------------------------------------------------------------------------
/src/main.rs:
--------------------------------------------------------------------------------
1 | use std::{
2 | fs::{self, create_dir, File},
3 | io::Write,
4 | };
5 |
6 | fn main() {
7 | let mut path_to_toml = std::env::args().nth(1).unwrap_or(String::from("Cake.toml"));
8 |
9 | if path_to_toml.starts_with("https://github.com") {
10 | // Downloads the cake.toml fromm the github repo
11 | let split_text = path_to_toml.split("/").collect::>();
12 | let repo_name = split_text[split_text.len() - 2];
13 | let user_name = split_text[split_text.len() - 3];
14 |
15 | let url = format!(
16 | "https://raw.githubusercontent.com/{}/{}/master/Cake.toml",
17 | user_name, repo_name
18 | );
19 |
20 | let response = ureq::get(&url).call();
21 | let mut file = File::create(path_to_toml).unwrap();
22 | file.write_all(response.into_string().unwrap().as_bytes()).unwrap();
23 | path_to_toml = "Cake.toml".to_string();
24 | }
25 |
26 | // Gets the Cake.toml file
27 | let toml = fs::read_to_string(path_to_toml).expect("Could not read the Cake.toml file.");
28 | let toml = match toml.parse::() {
29 | Ok(toml) => toml,
30 | Err(e) => panic!("Could not parse the Cake.toml file: {}", e),
31 | };
32 |
33 | let filestructure = toml["filestructure"].as_table().unwrap();
34 | let content = toml["content"].as_table().unwrap();
35 | let commands = toml["commands"].as_table().unwrap();
36 |
37 | if toml.get("metadata").is_some() {
38 | let metadata = toml["metadata"].as_table().unwrap();
39 |
40 | let name = metadata["name"].as_str().unwrap();
41 | let description = metadata["description"].as_str().unwrap();
42 | let version = metadata["version"].as_str().unwrap();
43 | let author = metadata["author"].as_str().unwrap();
44 |
45 | println!("Using {}", name);
46 | println!("{}", description);
47 | println!("Version: {}", version);
48 | println!("Author: {}", author);
49 | }
50 |
51 |
52 | // Creates the directories and files, and fills with content if any
53 | for (key, value) in filestructure {
54 | for file in value.as_array().unwrap() {
55 | let file = file.as_str().unwrap();
56 | println!("Creating {}", file);
57 |
58 | let mut filepath = String::new();
59 |
60 | // If key is root, create in the current directory
61 | if key == "root" {
62 | filepath = format!("{}", file);
63 | } else {
64 | let mut created = String::new();
65 | for folder in key.split("--") {
66 | // We are matching to prevent the panic from happening
67 | created += &format!("{}/", folder);
68 | match create_dir(created.clone()) {
69 | Ok(_) => (),
70 | Err(_) => (),
71 | }
72 | }
73 | filepath = format!("{}/{}", created, file);
74 | };
75 |
76 | let mut file = File::create(filepath).unwrap();
77 |
78 | // Creates the "content key" which is basically how it's written in the toml file
79 | let content_key = format!(
80 | "{}--{}",
81 | key,
82 | value.as_array().unwrap()[0]
83 | .as_str()
84 | .unwrap()
85 | .replace(".", "-")
86 | );
87 |
88 | // Checks if content key exists
89 | if content.contains_key(content_key.as_str()) {
90 | let content = content[content_key.as_str()].as_str().unwrap();
91 | file.write_all(content.as_bytes()).unwrap();
92 | };
93 | }
94 | }
95 |
96 | // Runs the commands one by one according to the number
97 | // I've done this by iterating over numbers from 1 to the number of commands
98 |
99 | for n in 1..commands.len() + 1 {
100 | println!("Running command {}", &n.to_string());
101 | let command = commands[&n.to_string()].as_array().unwrap();
102 |
103 | // Runs the command
104 | std::process::Command::new(command[0].as_str().unwrap())
105 | .args(
106 | command[1..]
107 | .iter()
108 | .map(|x| x.as_str().unwrap())
109 | .collect::>(),
110 | )
111 | .spawn()
112 | .expect("Could not run the command");
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 3
4 |
5 | [[package]]
6 | name = "ascii"
7 | version = "0.9.3"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e"
10 |
11 | [[package]]
12 | name = "autocfg"
13 | version = "1.1.0"
14 | source = "registry+https://github.com/rust-lang/crates.io-index"
15 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
16 |
17 | [[package]]
18 | name = "base64"
19 | version = "0.9.3"
20 | source = "registry+https://github.com/rust-lang/crates.io-index"
21 | checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
22 | dependencies = [
23 | "byteorder",
24 | "safemem",
25 | ]
26 |
27 | [[package]]
28 | name = "bitflags"
29 | version = "0.9.1"
30 | source = "registry+https://github.com/rust-lang/crates.io-index"
31 | checksum = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
32 |
33 | [[package]]
34 | name = "byteorder"
35 | version = "1.4.3"
36 | source = "registry+https://github.com/rust-lang/crates.io-index"
37 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
38 |
39 | [[package]]
40 | name = "cakecutter"
41 | version = "0.1.0"
42 | dependencies = [
43 | "toml",
44 | "ureq",
45 | ]
46 |
47 | [[package]]
48 | name = "cc"
49 | version = "1.0.73"
50 | source = "registry+https://github.com/rust-lang/crates.io-index"
51 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
52 |
53 | [[package]]
54 | name = "cfg-if"
55 | version = "1.0.0"
56 | source = "registry+https://github.com/rust-lang/crates.io-index"
57 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
58 |
59 | [[package]]
60 | name = "chunked_transfer"
61 | version = "0.3.1"
62 | source = "registry+https://github.com/rust-lang/crates.io-index"
63 | checksum = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87"
64 |
65 | [[package]]
66 | name = "cookie"
67 | version = "0.10.1"
68 | source = "registry+https://github.com/rust-lang/crates.io-index"
69 | checksum = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb"
70 | dependencies = [
71 | "time",
72 | "url",
73 | ]
74 |
75 | [[package]]
76 | name = "core-foundation"
77 | version = "0.2.3"
78 | source = "registry+https://github.com/rust-lang/crates.io-index"
79 | checksum = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67"
80 | dependencies = [
81 | "core-foundation-sys",
82 | "libc",
83 | ]
84 |
85 | [[package]]
86 | name = "core-foundation-sys"
87 | version = "0.2.3"
88 | source = "registry+https://github.com/rust-lang/crates.io-index"
89 | checksum = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d"
90 | dependencies = [
91 | "libc",
92 | ]
93 |
94 | [[package]]
95 | name = "dns-lookup"
96 | version = "0.9.1"
97 | source = "registry+https://github.com/rust-lang/crates.io-index"
98 | checksum = "54810764899241c707428f4a1989351f30c0c2bda5ea07ff2e43148f8935039f"
99 | dependencies = [
100 | "libc",
101 | "socket2",
102 | "winapi",
103 | ]
104 |
105 | [[package]]
106 | name = "encoding"
107 | version = "0.2.33"
108 | source = "registry+https://github.com/rust-lang/crates.io-index"
109 | checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
110 | dependencies = [
111 | "encoding-index-japanese",
112 | "encoding-index-korean",
113 | "encoding-index-simpchinese",
114 | "encoding-index-singlebyte",
115 | "encoding-index-tradchinese",
116 | ]
117 |
118 | [[package]]
119 | name = "encoding-index-japanese"
120 | version = "1.20141219.5"
121 | source = "registry+https://github.com/rust-lang/crates.io-index"
122 | checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
123 | dependencies = [
124 | "encoding_index_tests",
125 | ]
126 |
127 | [[package]]
128 | name = "encoding-index-korean"
129 | version = "1.20141219.5"
130 | source = "registry+https://github.com/rust-lang/crates.io-index"
131 | checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
132 | dependencies = [
133 | "encoding_index_tests",
134 | ]
135 |
136 | [[package]]
137 | name = "encoding-index-simpchinese"
138 | version = "1.20141219.5"
139 | source = "registry+https://github.com/rust-lang/crates.io-index"
140 | checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
141 | dependencies = [
142 | "encoding_index_tests",
143 | ]
144 |
145 | [[package]]
146 | name = "encoding-index-singlebyte"
147 | version = "1.20141219.5"
148 | source = "registry+https://github.com/rust-lang/crates.io-index"
149 | checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
150 | dependencies = [
151 | "encoding_index_tests",
152 | ]
153 |
154 | [[package]]
155 | name = "encoding-index-tradchinese"
156 | version = "1.20141219.5"
157 | source = "registry+https://github.com/rust-lang/crates.io-index"
158 | checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
159 | dependencies = [
160 | "encoding_index_tests",
161 | ]
162 |
163 | [[package]]
164 | name = "encoding_index_tests"
165 | version = "0.1.4"
166 | source = "registry+https://github.com/rust-lang/crates.io-index"
167 | checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
168 |
169 | [[package]]
170 | name = "foreign-types"
171 | version = "0.3.2"
172 | source = "registry+https://github.com/rust-lang/crates.io-index"
173 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
174 | dependencies = [
175 | "foreign-types-shared",
176 | ]
177 |
178 | [[package]]
179 | name = "foreign-types-shared"
180 | version = "0.1.1"
181 | source = "registry+https://github.com/rust-lang/crates.io-index"
182 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
183 |
184 | [[package]]
185 | name = "fuchsia-cprng"
186 | version = "0.1.1"
187 | source = "registry+https://github.com/rust-lang/crates.io-index"
188 | checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
189 |
190 | [[package]]
191 | name = "idna"
192 | version = "0.1.5"
193 | source = "registry+https://github.com/rust-lang/crates.io-index"
194 | checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
195 | dependencies = [
196 | "matches",
197 | "unicode-bidi",
198 | "unicode-normalization",
199 | ]
200 |
201 | [[package]]
202 | name = "itoa"
203 | version = "1.0.1"
204 | source = "registry+https://github.com/rust-lang/crates.io-index"
205 | checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
206 |
207 | [[package]]
208 | name = "lazy_static"
209 | version = "0.2.11"
210 | source = "registry+https://github.com/rust-lang/crates.io-index"
211 | checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
212 |
213 | [[package]]
214 | name = "lazy_static"
215 | version = "1.4.0"
216 | source = "registry+https://github.com/rust-lang/crates.io-index"
217 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
218 |
219 | [[package]]
220 | name = "libc"
221 | version = "0.2.119"
222 | source = "registry+https://github.com/rust-lang/crates.io-index"
223 | checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4"
224 |
225 | [[package]]
226 | name = "matches"
227 | version = "0.1.9"
228 | source = "registry+https://github.com/rust-lang/crates.io-index"
229 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
230 |
231 | [[package]]
232 | name = "native-tls"
233 | version = "0.1.5"
234 | source = "registry+https://github.com/rust-lang/crates.io-index"
235 | checksum = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0"
236 | dependencies = [
237 | "lazy_static 0.2.11",
238 | "libc",
239 | "openssl",
240 | "schannel",
241 | "security-framework",
242 | "security-framework-sys",
243 | "tempdir",
244 | ]
245 |
246 | [[package]]
247 | name = "openssl"
248 | version = "0.9.24"
249 | source = "registry+https://github.com/rust-lang/crates.io-index"
250 | checksum = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985"
251 | dependencies = [
252 | "bitflags",
253 | "foreign-types",
254 | "lazy_static 1.4.0",
255 | "libc",
256 | "openssl-sys",
257 | ]
258 |
259 | [[package]]
260 | name = "openssl-sys"
261 | version = "0.9.72"
262 | source = "registry+https://github.com/rust-lang/crates.io-index"
263 | checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb"
264 | dependencies = [
265 | "autocfg",
266 | "cc",
267 | "libc",
268 | "pkg-config",
269 | "vcpkg",
270 | ]
271 |
272 | [[package]]
273 | name = "percent-encoding"
274 | version = "1.0.1"
275 | source = "registry+https://github.com/rust-lang/crates.io-index"
276 | checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
277 |
278 | [[package]]
279 | name = "pkg-config"
280 | version = "0.3.24"
281 | source = "registry+https://github.com/rust-lang/crates.io-index"
282 | checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
283 |
284 | [[package]]
285 | name = "qstring"
286 | version = "0.6.0"
287 | source = "registry+https://github.com/rust-lang/crates.io-index"
288 | checksum = "545ec057a36a93e25fb5883baed912e4984af4e2543bbf0e3463d962e0408469"
289 | dependencies = [
290 | "percent-encoding",
291 | ]
292 |
293 | [[package]]
294 | name = "rand"
295 | version = "0.4.6"
296 | source = "registry+https://github.com/rust-lang/crates.io-index"
297 | checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
298 | dependencies = [
299 | "fuchsia-cprng",
300 | "libc",
301 | "rand_core 0.3.1",
302 | "rdrand",
303 | "winapi",
304 | ]
305 |
306 | [[package]]
307 | name = "rand_core"
308 | version = "0.3.1"
309 | source = "registry+https://github.com/rust-lang/crates.io-index"
310 | checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
311 | dependencies = [
312 | "rand_core 0.4.2",
313 | ]
314 |
315 | [[package]]
316 | name = "rand_core"
317 | version = "0.4.2"
318 | source = "registry+https://github.com/rust-lang/crates.io-index"
319 | checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
320 |
321 | [[package]]
322 | name = "rdrand"
323 | version = "0.4.0"
324 | source = "registry+https://github.com/rust-lang/crates.io-index"
325 | checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
326 | dependencies = [
327 | "rand_core 0.3.1",
328 | ]
329 |
330 | [[package]]
331 | name = "remove_dir_all"
332 | version = "0.5.3"
333 | source = "registry+https://github.com/rust-lang/crates.io-index"
334 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
335 | dependencies = [
336 | "winapi",
337 | ]
338 |
339 | [[package]]
340 | name = "ryu"
341 | version = "1.0.9"
342 | source = "registry+https://github.com/rust-lang/crates.io-index"
343 | checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
344 |
345 | [[package]]
346 | name = "safemem"
347 | version = "0.3.3"
348 | source = "registry+https://github.com/rust-lang/crates.io-index"
349 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
350 |
351 | [[package]]
352 | name = "schannel"
353 | version = "0.1.19"
354 | source = "registry+https://github.com/rust-lang/crates.io-index"
355 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
356 | dependencies = [
357 | "lazy_static 1.4.0",
358 | "winapi",
359 | ]
360 |
361 | [[package]]
362 | name = "security-framework"
363 | version = "0.1.16"
364 | source = "registry+https://github.com/rust-lang/crates.io-index"
365 | checksum = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332"
366 | dependencies = [
367 | "core-foundation",
368 | "core-foundation-sys",
369 | "libc",
370 | "security-framework-sys",
371 | ]
372 |
373 | [[package]]
374 | name = "security-framework-sys"
375 | version = "0.1.16"
376 | source = "registry+https://github.com/rust-lang/crates.io-index"
377 | checksum = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead"
378 | dependencies = [
379 | "core-foundation-sys",
380 | "libc",
381 | ]
382 |
383 | [[package]]
384 | name = "serde"
385 | version = "1.0.136"
386 | source = "registry+https://github.com/rust-lang/crates.io-index"
387 | checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
388 |
389 | [[package]]
390 | name = "serde_json"
391 | version = "1.0.79"
392 | source = "registry+https://github.com/rust-lang/crates.io-index"
393 | checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95"
394 | dependencies = [
395 | "itoa",
396 | "ryu",
397 | "serde",
398 | ]
399 |
400 | [[package]]
401 | name = "socket2"
402 | version = "0.3.19"
403 | source = "registry+https://github.com/rust-lang/crates.io-index"
404 | checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e"
405 | dependencies = [
406 | "cfg-if",
407 | "libc",
408 | "winapi",
409 | ]
410 |
411 | [[package]]
412 | name = "tempdir"
413 | version = "0.3.7"
414 | source = "registry+https://github.com/rust-lang/crates.io-index"
415 | checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
416 | dependencies = [
417 | "rand",
418 | "remove_dir_all",
419 | ]
420 |
421 | [[package]]
422 | name = "time"
423 | version = "0.1.44"
424 | source = "registry+https://github.com/rust-lang/crates.io-index"
425 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
426 | dependencies = [
427 | "libc",
428 | "wasi",
429 | "winapi",
430 | ]
431 |
432 | [[package]]
433 | name = "tinyvec"
434 | version = "1.5.1"
435 | source = "registry+https://github.com/rust-lang/crates.io-index"
436 | checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
437 | dependencies = [
438 | "tinyvec_macros",
439 | ]
440 |
441 | [[package]]
442 | name = "tinyvec_macros"
443 | version = "0.1.0"
444 | source = "registry+https://github.com/rust-lang/crates.io-index"
445 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
446 |
447 | [[package]]
448 | name = "toml"
449 | version = "0.5.8"
450 | source = "registry+https://github.com/rust-lang/crates.io-index"
451 | checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
452 | dependencies = [
453 | "serde",
454 | ]
455 |
456 | [[package]]
457 | name = "unicode-bidi"
458 | version = "0.3.7"
459 | source = "registry+https://github.com/rust-lang/crates.io-index"
460 | checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
461 |
462 | [[package]]
463 | name = "unicode-normalization"
464 | version = "0.1.19"
465 | source = "registry+https://github.com/rust-lang/crates.io-index"
466 | checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
467 | dependencies = [
468 | "tinyvec",
469 | ]
470 |
471 | [[package]]
472 | name = "ureq"
473 | version = "0.1.1"
474 | source = "registry+https://github.com/rust-lang/crates.io-index"
475 | checksum = "80fa4f2f5a128348c2bd9ba0e3c8b7b5583caf678053913039306270547b66fb"
476 | dependencies = [
477 | "ascii",
478 | "base64",
479 | "chunked_transfer",
480 | "cookie",
481 | "dns-lookup",
482 | "encoding",
483 | "lazy_static 1.4.0",
484 | "native-tls",
485 | "qstring",
486 | "serde_json",
487 | "url",
488 | ]
489 |
490 | [[package]]
491 | name = "url"
492 | version = "1.7.2"
493 | source = "registry+https://github.com/rust-lang/crates.io-index"
494 | checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
495 | dependencies = [
496 | "idna",
497 | "matches",
498 | "percent-encoding",
499 | ]
500 |
501 | [[package]]
502 | name = "vcpkg"
503 | version = "0.2.15"
504 | source = "registry+https://github.com/rust-lang/crates.io-index"
505 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
506 |
507 | [[package]]
508 | name = "wasi"
509 | version = "0.10.0+wasi-snapshot-preview1"
510 | source = "registry+https://github.com/rust-lang/crates.io-index"
511 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
512 |
513 | [[package]]
514 | name = "winapi"
515 | version = "0.3.9"
516 | source = "registry+https://github.com/rust-lang/crates.io-index"
517 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
518 | dependencies = [
519 | "winapi-i686-pc-windows-gnu",
520 | "winapi-x86_64-pc-windows-gnu",
521 | ]
522 |
523 | [[package]]
524 | name = "winapi-i686-pc-windows-gnu"
525 | version = "0.4.0"
526 | source = "registry+https://github.com/rust-lang/crates.io-index"
527 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
528 |
529 | [[package]]
530 | name = "winapi-x86_64-pc-windows-gnu"
531 | version = "0.4.0"
532 | source = "registry+https://github.com/rust-lang/crates.io-index"
533 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
534 |
--------------------------------------------------------------------------------