|  | @@ -61,10 +61,46 @@ In general, we use modules from only the Rust standard library
 | 
	
		
			
				|  |  |  whenever possible. We will review including external crates on a
 | 
	
		
			
				|  |  |  case-by-case basis.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +If a crate only contains traits meant for compatibility between Rust
 | 
	
		
			
				|  |  | +crates, such as [the digest crate](https://crates.io/crates/digest) or
 | 
	
		
			
				|  |  | +[the failure crate](https://crates.io/crates/failure), it is very likely
 | 
	
		
			
				|  |  | +permissible to add it as a dependency.  However, a brief review should
 | 
	
		
			
				|  |  | +be conducted as to the usefulness of implementing external traits
 | 
	
		
			
				|  |  | +(i.e. how widespread is the usage, how many other crates either
 | 
	
		
			
				|  |  | +implement the traits or have trait bounds based upon them), as well as
 | 
	
		
			
				|  |  | +the stability of the traits (i.e. if the trait is going to change, we'll
 | 
	
		
			
				|  |  | +potentially have to re-do all our implementations of it).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +For large external libraries, especially which implement features which
 | 
	
		
			
				|  |  | +would be labour-intensive to reproduce/maintain ourselves, such as
 | 
	
		
			
				|  |  | +cryptographic or mathematical/statistics libraries, only crates which
 | 
	
		
			
				|  |  | +have stabilised to 1.0.0 should be considered, however, again, we may
 | 
	
		
			
				|  |  | +make exceptions on a case-by-case basis.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Currently, Tor requires that you use the latest stable Rust version. At
 | 
	
		
			
				|  |  |  some point in the future, we will freeze on a given stable Rust version,
 | 
	
		
			
				|  |  |  to ensure backward compatibility with stable distributions that ship it.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | + Updating/Adding Dependencies
 | 
	
		
			
				|  |  | +------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +To add/remove/update dependencies, first add your dependencies,
 | 
	
		
			
				|  |  | +exactly specifying their versions, into the appropriate *crate-level*
 | 
	
		
			
				|  |  | +`Cargo.toml` in `src/rust/` (i.e. *not* `/src/rust/Cargo.toml`, but
 | 
	
		
			
				|  |  | +instead the one for your crate).  Also, investigate whether your
 | 
	
		
			
				|  |  | +dependency has any optional dependencies which are unnecessary but are
 | 
	
		
			
				|  |  | +enabled by default.  If so, you'll likely be able to enable/disable
 | 
	
		
			
				|  |  | +them via some feature, e.g.:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```toml
 | 
	
		
			
				|  |  | +[dependencies]
 | 
	
		
			
				|  |  | +foo = { version = "1.0.0", default-features = false }
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Next, run `/scripts/maint/updateRustDependencies.sh`.  Then, go into
 | 
	
		
			
				|  |  | +`src/ext/rust` and commit the changes to the `tor-rust-dependencies`
 | 
	
		
			
				|  |  | +repo.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |   Documentation
 | 
	
		
			
				|  |  |  ---------------
 | 
	
		
			
				|  |  |  
 |