Module application

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.