2015-08-30 22:06:10 +00:00
# Rust Design Patterns
An open source repository of design patterns and idioms in the Rust programming
language.
## Contents
[Introduction ](intro.md )
### Idioms
2015-08-31 04:24:23 +00:00
* [Constructor ](idioms/ctor.md )
2015-10-15 02:08:29 +00:00
* [Concatenating strings with `format!` ](idioms/concat-format.md )
2015-12-08 21:59:30 +00:00
* [Privacy for extensibility ](idioms/priv-extend.md )
2015-10-15 06:29:27 +00:00
* TODO trait to separate visibility of methods from visibility of data (https://github.com/sfackler/rust-postgres/blob/master/src/lib.rs#L1400)
2015-10-22 20:53:16 +00:00
* [Collections are smart pointers ](idioms/deref.md )
2015-10-15 06:29:27 +00:00
* TODO leak amplification ("Vec::drain sets the Vec's len to 0 prematurely so that mem::forgetting Drain "only" mem::forgets more stuff. instead of exposing uninitialized memory or having to update the len on every iteration")
2015-10-22 20:53:16 +00:00
* [Finalisation in destructors ](idioms/dtor-finally.md )
2015-10-15 06:29:27 +00:00
* TODO interior mutability - UnsafeCell, Cell, RefCell
* TODO treating Option like a list
2015-10-31 17:40:47 +00:00
* TODO `Default` trait
2015-08-30 22:06:10 +00:00
### Design patterns
2015-10-15 02:08:29 +00:00
* [Builder ](patterns/builder.md )
2015-10-22 21:59:00 +00:00
* [RAII guards ](patterns/RAII.md )
2015-10-15 06:29:27 +00:00
* [Newtype ](patterns/newtype.md )
* TODO iterators (to safely avoid bounds checks)
* TODO closures and lifetimes (coupling to lifetime)
* TODO platform-specific sub-modules (https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md#platform-specific-opt-in)
2015-10-22 20:53:16 +00:00
* [Entry API ](patterns/entry.md )
2015-12-09 01:00:17 +00:00
* [Visitor ](patterns/visitor.md )
2015-10-15 06:29:27 +00:00
* TODO fold
* TODO small crates and semver
* TODO extension traits
* TODO destructor bombs (ensure linear typing dynamically, e.g., https://github.com/Munksgaard/session-types/commit/0f25ccb7c3bc9f65fa8eaf538233e8fe344a189a)
* TODO convertible to Foo trait for more generic generics (e.g., http://static.rust-lang.org/doc/master/std/fs/struct.File.html#method.open)
2015-10-22 20:53:16 +00:00
* [Late bound bounds ](patterns/late-bounds.md )
2015-10-15 06:29:27 +00:00
* TODO 'shadow' borrowed version of struct - e.g., double buffering, Niko's parser generator
* TODO composition of structs to please the borrow checker
2015-10-27 09:07:01 +00:00
* TODO `Error` traits and `Result` forwarding
2015-10-31 17:40:47 +00:00
* TODO graphs
2015-10-19 20:44:24 +00:00
* [Compose structs together for better borrowing ](patterns/compose-structs.md )
2015-10-15 02:08:29 +00:00
2015-08-30 22:06:10 +00:00
### Anti-patterns
2015-10-15 06:29:27 +00:00
* TODO thread + catch_panic for exceptions
* TODO Clone to satisfy the borrow checker
2015-10-31 17:40:47 +00:00
* [Deref polymorphism ](anti_patterns/deref.md )
2015-10-15 06:29:27 +00:00
* TODO Matching all fields of a struct (back compat)
* TODO wildcard matches
2015-10-22 20:53:16 +00:00
* TODO taking an enum rather than having multiple functions
2015-10-27 09:07:01 +00:00
* TODO `unwrap()` ing every `Result` instead of forwarding it
2015-10-15 02:08:29 +00:00
2015-08-30 22:06:10 +00:00
## Contributing
2015-10-15 02:12:37 +00:00
Contributions are very welcome!
2015-08-30 22:06:10 +00:00
You should start with [the template ](template.md ). Copy it into the appropriate
directory, edit it, and submit a PR. You might not want every section, and you
2015-10-15 02:12:37 +00:00
might want to add extra sections.
Correction and elaboration PRs are very welcome.