Module application

Source
Expand description

§Application Customization

§Overview

This module contains traits that library consumers can use for extending modalkit to better fit their own needs.

§Example

use std::fmt;
use std::path::PathBuf;

use editor_types::{
    application::{
        ApplicationAction,
        ApplicationError,
        ApplicationWindowId,
        ApplicationContentId,
        ApplicationInfo,
        ApplicationStore,
    },
    context::EditContext,
    prelude::*,
};
use keybindings::SequenceStatus;

// Unique identifier for a review.
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
struct ReviewId(usize);

// Unique identifier for a user.
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
struct UserId(usize);

#[derive(Clone, Debug, Eq, PartialEq)]
enum CodeReviewAction {
    // Approve a review for merging.
    Approve(ReviewId),

    // Leave a comment on a line in a file in a review.
    Comment(ReviewId, PathBuf, usize, String),

    // Show more lines around the hunk.
    ExpandHunk(Count),

    // Merge changes after review and approval.
    Merge(ReviewId),
}

impl ApplicationAction for CodeReviewAction {
    fn is_edit_sequence(&self, _: &EditContext) -> SequenceStatus {
        match self {
            CodeReviewAction::Approve(..) => SequenceStatus::Break,
            CodeReviewAction::Comment(..) => SequenceStatus::Break,
            CodeReviewAction::ExpandHunk(..) => SequenceStatus::Atom,
            CodeReviewAction::Merge(..) => SequenceStatus::Break,
        }
    }

    fn is_last_action(&self, _: &EditContext) -> SequenceStatus {
        match self {
            CodeReviewAction::Approve(..) => SequenceStatus::Atom,
            CodeReviewAction::Comment(..) => SequenceStatus::Atom,
            CodeReviewAction::ExpandHunk(..) => SequenceStatus::Atom,
            CodeReviewAction::Merge(..) => SequenceStatus::Atom,
        }
    }

    fn is_last_selection(&self, _: &EditContext) -> SequenceStatus {
        match self {
            CodeReviewAction::Approve(..) => SequenceStatus::Ignore,
            CodeReviewAction::Comment(..) => SequenceStatus::Ignore,
            CodeReviewAction::ExpandHunk(..) => SequenceStatus::Ignore,
            CodeReviewAction::Merge(..) => SequenceStatus::Ignore,
        }
    }

    fn is_switchable(&self, _: &EditContext) -> bool {
        match self {
            CodeReviewAction::Approve(..) => false,
            CodeReviewAction::Comment(..) => false,
            CodeReviewAction::ExpandHunk(..) => false,
            CodeReviewAction::Merge(..) => false,
        }
    }
}

struct CodeReviewStore {
    user: UserId,
}

impl ApplicationStore for CodeReviewStore {}

#[derive(Clone, Debug, Eq, Hash, PartialEq)]
enum CodeReviewWindowId {
    // A window that shows a code review.
    Review(ReviewId),

    // A window that shows a user's open reviews.
    User(UserId),
}

impl ApplicationWindowId for CodeReviewWindowId {}

#[derive(Clone, Debug, Eq, Hash, PartialEq)]
enum CodeReviewContentId {
    // Different buffer used by the command bar.
    Command(CommandType),

    // Buffer for a comment left on a line.
    Review(ReviewId, usize),
}

impl ApplicationContentId for CodeReviewContentId {}

#[derive(Debug)]
enum CodeReviewError {
    NoReview(ReviewId),
}

impl fmt::Display for CodeReviewError {
   fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
       match self {
           CodeReviewError::NoReview(id) => write!(f, "No review with ID {:?}", id),
       }
   }
}

impl ApplicationError for CodeReviewError {}

#[derive(Clone, Debug, Eq, PartialEq)]
enum CodeReviewInfo {}

impl ApplicationInfo for CodeReviewInfo {
    type Error = CodeReviewError;
    type Action = CodeReviewAction;
    type Store = CodeReviewStore;
    type WindowId = CodeReviewWindowId;
    type ContentId = CodeReviewContentId;

    fn content_of_command(ct: CommandType) -> CodeReviewContentId {
        CodeReviewContentId::Command(ct)
    }
}

Enums§

EmptyInfo
A default implementor of ApplicationInfo for consumers that don’t require any customization.

Traits§

ApplicationAction
Trait for objects that describe application-specific actions.
ApplicationContentId
Trait for identifiers of specific content within a window in an application.
ApplicationError
Trait for application-specific errors.
ApplicationInfo
Trait for objects that describe application-specific behaviour and types.
ApplicationStore
Trait for objects that hold application-specific information.
ApplicationWindowId
Trait for window identifiers in an application.