ac-library-rs
ac-library-rs copied to clipboard
Follow **part of** the Rust API guidelines
Relating to #18.
https://rust-lang.github.io/api-guidelines/checklist.html
- Naming (crate aligns with Rust naming conventions)
- [ ] Casing conforms to RFC 430 (C-CASE)
- [x] Ad-hoc conversions follow
as_,to_,into_conventions (C-CONV) - [x] Getter names follow Rust convention (C-GETTER)
- [x] Methods on collections that produce iterators follow
iter,iter_mut,into_iter(C-ITER) - [x] Iterator type names match the methods that produce them (C-ITER-TY)
- [x] Feature names are free of placeholder words (C-FEATURE)
- [x] Names use a consistent word order (C-WORD-ORDER)
- Interoperability (crate interacts nicely with other library functionality)
- [ ] Types eagerly implement common traits (C-COMMON-TRAITS)
Copy,Clone,Eq,PartialEq,Ord,PartialOrd,Hash,Debug,Display,Default
- [x] Conversions use the standard traits
From,AsRef,AsMut(C-CONV-TRAITS) - [ ] Collections implement
FromIteratorandExtend(C-COLLECT) - [x] Data structures implement Serde's
Serialize,Deserialize(C-SERDE) - [ ] Types are
SendandSyncwhere possible (C-SEND-SYNC) - [x] Error types are meaningful and well-behaved (C-GOOD-ERR)
- [ ] Binary number types provide
Hex,Octal,Binaryformatting (C-NUM-FMT) - [x] Generic reader/writer functions take
R: ReadandW: Writeby value (C-RW-VALUE)
- [ ] Types eagerly implement common traits (C-COMMON-TRAITS)
- Macros (crate presents well-behaved macros)
- [x] Input syntax is evocative of the output (C-EVOCATIVE)
- [x] Macros compose well with attributes (C-MACRO-ATTR)
- [x] Item macros work anywhere that items are allowed (C-ANYWHERE)
- [x] Item macros support visibility specifiers (C-MACRO-VIS)
- [x] Type fragments are flexible (C-MACRO-TY)
- Documentation (crate is abundantly documented)
- [ ] Crate level docs are thorough and include examples (C-CRATE-DOC)
- [ ] All items have a rustdoc example (C-EXAMPLE)
- [ ] Examples use
?, nottry!, notunwrap(C-QUESTION-MARK) - [ ] Function docs include error, panic, and safety considerations (C-FAILURE)
- [ ] Prose contains hyperlinks to relevant things (C-LINK)
- [x] Cargo.toml includes all common metadata (C-METADATA)
- authors, description, license, homepage, documentation, repository, readme, keywords, categories
- [ ] Crate sets html_root_url attribute "https://docs.rs/CRATE/X.Y.Z" (C-HTML-ROOT)
- [ ] Release notes document all significant changes (C-RELNOTES)
- [ ] Rustdoc does not show unhelpful implementation details (C-HIDDEN)
- Predictability (crate enables legible code that acts how it looks)
- [x] Smart pointers do not add inherent methods (C-SMART-PTR)
- [x] Conversions live on the most specific type involved (C-CONV-SPECIFIC)
- [x] Functions with a clear receiver are methods (C-METHOD)
- [x] Functions do not take out-parameters (C-NO-OUT)
- [x] Operator overloads are unsurprising (C-OVERLOAD)
- [x] Only smart pointers implement
DerefandDerefMut(C-DEREF) - [x] Constructors are static, inherent methods (C-CTOR)
- Flexibility (crate supports diverse real-world use cases)
- [ ] Functions expose intermediate results to avoid duplicate work (C-INTERMEDIATE)
- [ ] Caller decides where to copy and place data (C-CALLER-CONTROL)
- [ ] Functions minimize assumptions about parameters by using generics (C-GENERIC)
- [ ] Traits are object-safe if they may be useful as a trait object (C-OBJECT)
- Type safety (crate leverages the type system effectively)
- [ ] Newtypes provide static distinctions (C-NEWTYPE)
- [ ] Arguments convey meaning through types, not
boolorOption(C-CUSTOM-TYPE) - [x] Types for a set of flags are
bitflags, not enums (C-BITFLAG) - [x] Builders enable construction of complex values (C-BUILDER)
- Dependability (crate is unlikely to do the wrong thing)
- [x] Functions validate their arguments (C-VALIDATE)
- [x] Destructors never fail (C-DTOR-FAIL)
- [x] Destructors that may block have alternatives (C-DTOR-BLOCK)
- Debuggability (crate is conducive to easy debugging)
- [ ] All public types implement
Debug(C-DEBUG) - [x]
Debugrepresentation is never empty (C-DEBUG-NONEMPTY)
- [ ] All public types implement
- Future proofing (crate is free to improve without breaking users' code)
- [ ] Sealed traits protect against downstream implementations (C-SEALED)
- [x] Structs have private fields (C-STRUCT-PRIVATE)
- [x] Newtypes encapsulate implementation details (C-NEWTYPE-HIDE)
- [ ] Data structures do not duplicate derived trait bounds (C-STRUCT-BOUNDS)
- Necessities (to whom they matter, they really matter)
- [x] Public dependencies of a stable crate are stable (C-STABLE)
- [ ] Crate and its dependencies have a permissive license (C-PERMISSIVE)
C-CASE
Should we rename Segtree to SegTree?
C-COMMON-TRAITS, C-DEBUG
Most of the traits can be just #[derive]d.
C-COLLECT
Maybe Segtree and LazySegtree should implement FromIterator.
C-SEND-SYNC
It is easy to test, but is it really necessary? The following situation would rarely occur even if we add public non-Send types in the future, I think.
use std::thread;
let x = TypeThatHasRc::new();
thread::Builder::new()
.name("with-large-stack".into())
.stack_size(32 * 1024 * 1024)
.spawn(move || {
let _ = x;
})
.unwrap()
.join()
.unwrap();
C-NUM-FMT
Should ModInts implement them...?
dbg!("{:#b}", x);
C-EXAMPLE
Examples will help users, especially Rust beginners.
C-FAILURE
We should add "# Panics" sections.
C-PERMISSIVE
Maybe we should add "# License" section the the README.