ac-library-rs icon indicating copy to clipboard operation
ac-library-rs copied to clipboard

Follow **part of** the Rust API guidelines

Open qryxip opened this issue 5 years ago • 0 comments

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 FromIterator and Extend (C-COLLECT)
    • [x] Data structures implement Serde's Serialize, Deserialize (C-SERDE)
    • [ ] Types are Send and Sync where possible (C-SEND-SYNC)
    • [x] Error types are meaningful and well-behaved (C-GOOD-ERR)
    • [ ] Binary number types provide Hex, Octal, Binary formatting (C-NUM-FMT)
    • [x] Generic reader/writer functions take R: Read and W: Write by value (C-RW-VALUE)
  • 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 ?, not try!, not unwrap (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 Deref and DerefMut (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 bool or Option (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)
  • Debuggability (crate is conducive to easy debugging)
  • 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.

qryxip avatar Sep 24 '20 08:09 qryxip