2.6 KiB
Code Style Guide
Beyond using Cargo format and Clippy, there are some specific code style guidelines laid out in this document for different parts of the project.
Writing Style
- Shorten "identifier" to "Id" with that exact casing, i.e. Server Id.
core/database crate
w.r.t. model.rs files
-
All struct definitions must be commented.
/// Server pub struct Server { /// Name of the server pub name: String, -
Struct definitions should not include derives unless necessary (if additional traits such as Hash are required) and instead use
auto_derived!andauto_derived_partial!.auto_derived_partial!( /// Server pub struct Server { .. }, "PartialServer" ); -
auto_derived!macro accepts multiple entries and should be used as such:auto_derived!( /// Optional fields on server object pub enum FieldsServer { .. } /// Optional fields on server object pub enum FieldsRole { .. } ); -
If special serialisation conditions are required, such as checking if a boolean is false, use the existing definitions for these functions from the crate root:
#[serde(skip_serializing_if = "crate::if_false", default)] -
implblocks may be defined below the struct definitions and should be ordered in the same order of definition. Methods in the block must follow the same guidelines as traits where-in: methods are ordered in terms of CRUD, there are empty line breaks, and methods are commented.
w.r.t. ops module for models
-
All traits must use a the name format
AbstractPluralwhere Plural is the plural form of the collection. e.g. Servers -
Traits defined must follow these guidelines:
-
Methods are ordered in terms of CRUD, create-read-update-delete ordering.
#[async_trait] pub trait AbstractServerMembers: Sync + Send { /// Insert a new server member into the database async fn insert_member(&self, member: &Member) -> Result<()>; /// Fetch a server member by their id async fn fetch_member(&self, server_id: &str, user_id: &str) -> Result<Member>; /// Update information for a server member async fn update_member(&self, .. ) -> Result<()>; /// Delete a server member by their id async fn delete_member(&self, id: &MemberCompositeKey) -> Result<()>; } -
There should be an empty line break between each method declaration.
-
All methods must have an appropriate comment.
-
-
When implementing the trait defined in
ops.rswith each driver, the method declaration style should be the same for ease of searching: same ordering, same comments, same line breaks.