├── .gitignore ├── src ├── ray.rs ├── scene.rs ├── shapes.rs ├── main.rs └── point.rs ├── examples └── test.json ├── Cargo.toml └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /src/ray.rs: -------------------------------------------------------------------------------- 1 | use point::Point; 2 | 3 | #[derive(Debug)] 4 | pub struct Ray { 5 | pub origin: Point, 6 | pub direction: Point 7 | } 8 | -------------------------------------------------------------------------------- /src/scene.rs: -------------------------------------------------------------------------------- 1 | use shapes::Sphere; 2 | 3 | #[derive(Serialize, Deserialize, Debug)] 4 | pub struct Scene { 5 | pub objects: Vec 6 | } 7 | -------------------------------------------------------------------------------- /examples/test.json: -------------------------------------------------------------------------------- 1 | { 2 | "objects": [ 3 | { 4 | "origin": { 5 | "x": 1.0, 6 | "y": 1.0, 7 | "z": 1.0 8 | }, 9 | "radius": 1.0 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rrt" 3 | version = "0.1.0" 4 | authors = ["Michael Maclean "] 5 | 6 | [dependencies] 7 | num = "0.1.36" 8 | docopt = "0.6.86" 9 | rustc-serialize = "0.3.22" 10 | 11 | serde = "0.8" 12 | serde_derive = "0.8" 13 | serde_json = "0.8" 14 | -------------------------------------------------------------------------------- /src/shapes.rs: -------------------------------------------------------------------------------- 1 | use ray::Ray; 2 | use point::Point; 3 | 4 | pub enum Intersection { 5 | Hit(f64), 6 | Miss 7 | } 8 | 9 | pub trait Intersectable { 10 | fn intersects(&self, ray: &Ray) -> Intersection; 11 | } 12 | 13 | #[derive(Serialize, Deserialize, Debug)] 14 | pub struct Sphere { 15 | pub origin: Point, 16 | pub radius: f64 17 | } 18 | 19 | impl Intersectable for Sphere { 20 | fn intersects(&self, ray: &Ray) -> Intersection { 21 | let l = self.origin - ray.origin; 22 | let tca = l.dot(ray.direction); 23 | let radius2 = self.radius * self.radius; 24 | 25 | if tca < 0.0 { 26 | return Intersection::Miss; 27 | } 28 | 29 | let d2 = l.dot(l) - tca * tca; 30 | if d2 > radius2 { 31 | return Intersection::Miss; 32 | } 33 | 34 | let thc = (radius2 - d2).sqrt(); 35 | let t0 = tca - thc; 36 | let t1 = tca + thc; 37 | 38 | let final_t0; 39 | let final_t1; 40 | 41 | if t0 > t1 { 42 | final_t0 = t0; 43 | final_t1 = t1; 44 | } else { 45 | final_t0 = t1; 46 | final_t1 = t0; 47 | } 48 | 49 | if final_t0 < 0.0 { 50 | if final_t1 < 0.0 { 51 | return Intersection::Miss; // both t0 and t1 are negative 52 | } 53 | } 54 | 55 | if final_t0 > final_t1 { 56 | return Intersection::Hit(final_t0) 57 | } 58 | 59 | return Intersection::Hit(final_t1) 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(proc_macro)] 2 | 3 | #[macro_use] 4 | extern crate serde_derive; 5 | extern crate serde_json; 6 | 7 | extern crate docopt; 8 | extern crate rustc_serialize; 9 | 10 | mod point; 11 | mod ray; 12 | mod shapes; 13 | mod scene; 14 | 15 | use std::fs::File; 16 | use std::path::Path; 17 | use std::error::Error; 18 | use docopt::Docopt; 19 | 20 | use scene::Scene; 21 | use shapes::Sphere; 22 | use point::Point; 23 | 24 | const USAGE: &'static str = " 25 | Usage: rrt [-d] SCENE 26 | rrt (--help | --version) 27 | 28 | Options: 29 | -d, --debug Enable debug output 30 | -h, --help Show this message 31 | --version Show the version 32 | "; 33 | 34 | #[derive(RustcDecodable)] 35 | struct Args { 36 | arg_SCENE: String, 37 | flag_debug: bool 38 | } 39 | 40 | fn load_scene(filename: &String) -> Scene { 41 | let path = Path::new(filename); 42 | 43 | let file = match File::open(&path) { 44 | Err(why) => panic!("couldn't open {}: {}", path.display(), why.description()), 45 | Ok(file) => file 46 | }; 47 | 48 | match serde_json::from_reader(file) { 49 | Err(why) => panic!("Couldn't load {}: {:?}", path.display(), why), 50 | Ok(scene) => scene 51 | } 52 | } 53 | 54 | fn main() { 55 | let args: Args = Docopt::new(USAGE) 56 | .and_then(|d| d.decode()) 57 | .unwrap_or_else(|e| e.exit()); 58 | 59 | if args.flag_debug { 60 | println!("Debug mode enabled"); 61 | } 62 | 63 | let scene = load_scene(&args.arg_SCENE); 64 | println!("{:?}", scene); 65 | } 66 | -------------------------------------------------------------------------------- /src/point.rs: -------------------------------------------------------------------------------- 1 | extern crate num; 2 | 3 | use std::ops::{Add, Sub, Mul, Div}; 4 | 5 | type Float = f64; 6 | 7 | #[derive(Serialize, Deserialize, PartialOrd, Debug, PartialEq, Clone, Copy)] 8 | pub struct Point { 9 | pub x: f64, 10 | pub y: f64, 11 | pub z: f64 12 | } 13 | 14 | impl Add for Point { 15 | type Output = Point; 16 | 17 | fn add(self, other: Point) -> Point { 18 | Point {x: self.x + other.x, y: self.y + other.y, z: self.z + other.z} 19 | } 20 | } 21 | 22 | impl Add for Point { 23 | type Output = Point; 24 | 25 | fn add(self, other: Float) -> Point { 26 | Point {x: self.x + other, y: self.y + other, z: self.z + other} 27 | } 28 | } 29 | 30 | impl Sub for Point { 31 | type Output = Point; 32 | 33 | fn sub(self, other: Point) -> Point { 34 | Point {x: self.x - other.x, y: self.y - other.y, z: self.z - other.z} 35 | } 36 | } 37 | 38 | impl Sub for Point { 39 | type Output = Point; 40 | 41 | fn sub(self, other: Float) -> Point { 42 | Point {x: self.x - other, y: self.y - other, z: self.z - other} 43 | } 44 | } 45 | 46 | impl Mul for Point { 47 | type Output = Point; 48 | 49 | fn mul(self, other: Point) -> Point { 50 | Point {x: self.x * other.x, y: self.y * other.y, z: self.z * other.z} 51 | } 52 | 53 | } 54 | 55 | impl Mul for Point { 56 | type Output = Point; 57 | 58 | fn mul(self, other: Float) -> Point { 59 | Point {x: self.x * other, y: self.y * other, z: self.z * other} 60 | } 61 | } 62 | 63 | impl Div for Point { 64 | type Output = Point; 65 | 66 | fn div(self, other: Point) -> Point { 67 | Point {x: self.x / other.x, y: self.y / other.y, z: self.z / other.z} 68 | } 69 | 70 | } 71 | 72 | impl Div for Point { 73 | type Output = Point; 74 | 75 | fn div(self, other: Float) -> Point { 76 | Point {x: self.x / other, y: self.y / other, z: self.z / other} 77 | } 78 | } 79 | 80 | impl Point { 81 | pub fn dot(self, other: Point) -> f64 { 82 | self.x * other.x + self.y * other.y + self.z * other.z 83 | } 84 | 85 | pub fn cross(self, other: Point) -> Point { 86 | Point { 87 | x: self.y * other.z - self.z * other.y, 88 | y: -(self.x * other.z - self.z * other.x), 89 | z: self.x * other.y - self.y * other.x 90 | } 91 | } 92 | 93 | pub fn length(self) -> f64 { 94 | (self.x * self.x + self.y * self.y + self.z * self.z).sqrt() 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [root] 2 | name = "rrt" 3 | version = "0.1.0" 4 | dependencies = [ 5 | "docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)", 6 | "num 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 7 | "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", 8 | "serde 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)", 9 | "serde_derive 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)", 10 | "serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", 11 | ] 12 | 13 | [[package]] 14 | name = "aho-corasick" 15 | version = "0.5.3" 16 | source = "registry+https://github.com/rust-lang/crates.io-index" 17 | dependencies = [ 18 | "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 19 | ] 20 | 21 | [[package]] 22 | name = "docopt" 23 | version = "0.6.86" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | dependencies = [ 26 | "lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 27 | "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", 28 | "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", 29 | "strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 30 | ] 31 | 32 | [[package]] 33 | name = "dtoa" 34 | version = "0.2.2" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | 37 | [[package]] 38 | name = "itoa" 39 | version = "0.1.1" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | 42 | [[package]] 43 | name = "kernel32-sys" 44 | version = "0.2.2" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | dependencies = [ 47 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 49 | ] 50 | 51 | [[package]] 52 | name = "lazy_static" 53 | version = "0.2.2" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | 56 | [[package]] 57 | name = "libc" 58 | version = "0.2.18" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | 61 | [[package]] 62 | name = "memchr" 63 | version = "0.1.11" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | dependencies = [ 66 | "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 67 | ] 68 | 69 | [[package]] 70 | name = "num" 71 | version = "0.1.36" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | dependencies = [ 74 | "num-bigint 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "num-complex 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 77 | "num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 78 | "num-rational 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 79 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 80 | ] 81 | 82 | [[package]] 83 | name = "num-bigint" 84 | version = "0.1.35" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | dependencies = [ 87 | "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 88 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 89 | "rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", 90 | "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", 91 | ] 92 | 93 | [[package]] 94 | name = "num-complex" 95 | version = "0.1.35" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | dependencies = [ 98 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 99 | "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", 100 | ] 101 | 102 | [[package]] 103 | name = "num-integer" 104 | version = "0.1.32" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | dependencies = [ 107 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 108 | ] 109 | 110 | [[package]] 111 | name = "num-iter" 112 | version = "0.1.32" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | dependencies = [ 115 | "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 116 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 117 | ] 118 | 119 | [[package]] 120 | name = "num-rational" 121 | version = "0.1.35" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | dependencies = [ 124 | "num-bigint 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", 125 | "num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 126 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 127 | "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", 128 | ] 129 | 130 | [[package]] 131 | name = "num-traits" 132 | version = "0.1.36" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | 135 | [[package]] 136 | name = "quote" 137 | version = "0.3.10" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | 140 | [[package]] 141 | name = "rand" 142 | version = "0.3.15" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | dependencies = [ 145 | "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 146 | ] 147 | 148 | [[package]] 149 | name = "regex" 150 | version = "0.1.80" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | dependencies = [ 153 | "aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 154 | "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 155 | "regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 156 | "thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 157 | "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 158 | ] 159 | 160 | [[package]] 161 | name = "regex-syntax" 162 | version = "0.3.9" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | 165 | [[package]] 166 | name = "rustc-serialize" 167 | version = "0.3.22" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | 170 | [[package]] 171 | name = "serde" 172 | version = "0.8.21" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | 175 | [[package]] 176 | name = "serde_codegen" 177 | version = "0.8.21" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | dependencies = [ 180 | "quote 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", 181 | "serde_codegen_internals 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", 182 | "syn 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)", 183 | ] 184 | 185 | [[package]] 186 | name = "serde_codegen_internals" 187 | version = "0.11.3" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | dependencies = [ 190 | "syn 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)", 191 | ] 192 | 193 | [[package]] 194 | name = "serde_derive" 195 | version = "0.8.21" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | dependencies = [ 198 | "serde_codegen 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)", 199 | ] 200 | 201 | [[package]] 202 | name = "serde_json" 203 | version = "0.8.4" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | dependencies = [ 206 | "dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 207 | "itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 208 | "num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", 209 | "serde 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)", 210 | ] 211 | 212 | [[package]] 213 | name = "strsim" 214 | version = "0.5.2" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | 217 | [[package]] 218 | name = "syn" 219 | version = "0.10.5" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | dependencies = [ 222 | "quote 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)", 223 | "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 224 | ] 225 | 226 | [[package]] 227 | name = "thread-id" 228 | version = "2.0.0" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | dependencies = [ 231 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 232 | "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 233 | ] 234 | 235 | [[package]] 236 | name = "thread_local" 237 | version = "0.2.7" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | dependencies = [ 240 | "thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 241 | ] 242 | 243 | [[package]] 244 | name = "unicode-xid" 245 | version = "0.0.3" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | 248 | [[package]] 249 | name = "utf8-ranges" 250 | version = "0.1.3" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | 253 | [[package]] 254 | name = "winapi" 255 | version = "0.2.8" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | 258 | [[package]] 259 | name = "winapi-build" 260 | version = "0.1.1" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | 263 | [metadata] 264 | "checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66" 265 | "checksum docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)" = "4a7ef30445607f6fc8720f0a0a2c7442284b629cf0d049286860fae23e71c4d9" 266 | "checksum dtoa 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd841b58510c9618291ffa448da2e4e0f699d984d436122372f446dae62263d" 267 | "checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1" 268 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 269 | "checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b" 270 | "checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70" 271 | "checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" 272 | "checksum num 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "bde7c03b09e7c6a301ee81f6ddf66d7a28ec305699e3d3b056d2fc56470e3120" 273 | "checksum num-bigint 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "88b14378471f7c2adc5262f05b4701ef53e8da376453a8d8fee48e51db745e49" 274 | "checksum num-complex 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c78e054dd19c3fd03419ade63fa661e9c49bb890ce3beb4eee5b7baf93f92f" 275 | "checksum num-integer 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "fb24d9bfb3f222010df27995441ded1e954f8f69cd35021f6bef02ca9552fb92" 276 | "checksum num-iter 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "287a1c9969a847055e1122ec0ea7a5c5d6f72aad97934e131c83d5c08ab4e45c" 277 | "checksum num-rational 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "54ff603b8334a72fbb27fe66948aac0abaaa40231b3cecd189e76162f6f38aaf" 278 | "checksum num-traits 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "a16a42856a256b39c6d3484f097f6713e14feacd9bfb02290917904fae46c81c" 279 | "checksum quote 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6732e32663c9c271bfc7c1823486b471f18c47a2dbf87c066897b7b51afc83be" 280 | "checksum rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "022e0636ec2519ddae48154b028864bdce4eaf7d35226ab8e65c611be97b189d" 281 | "checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" 282 | "checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" 283 | "checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b" 284 | "checksum serde 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)" = "7b7c6bf11cf766473ea1d53eb4e3bc4e80f31f50082fc24077cf06f600279a66" 285 | "checksum serde_codegen 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)" = "64e0d87d19ec28bf431ffa9bad1f1e4ea3b381cd616c6cc56dca9eedbc7f6ab8" 286 | "checksum serde_codegen_internals 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "afad7924a009f859f380e4a2e3a509a845c2ac66435fcead74a4d983b21ae806" 287 | "checksum serde_derive 0.8.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6e7ad1e74679b92730ca39c361ea125e2846df337c5d94d084eb2f7837c1843d" 288 | "checksum serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3f7d3c184d35801fb8b32b46a7d58d57dbcc150b0eb2b46a1eb79645e8ecfd5b" 289 | "checksum strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c" 290 | "checksum syn 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1a437f8b4353179418870f014113876cd4cd4f642e42dbc5ed4f328d5f808246" 291 | "checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03" 292 | "checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5" 293 | "checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb" 294 | "checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f" 295 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 296 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 297 | --------------------------------------------------------------------------------