Skip to main content

elizaos_plugin_github/actions/
mod.rs

1#![allow(missing_docs)]
2
3pub mod create_branch;
4pub mod create_comment;
5pub mod create_issue;
6pub mod create_pull_request;
7pub mod merge_pull_request;
8pub mod push_code;
9pub mod review_pull_request;
10
11pub use create_branch::CreateBranchAction;
12pub use create_comment::CreateCommentAction;
13pub use create_issue::CreateIssueAction;
14pub use create_pull_request::CreatePullRequestAction;
15pub use merge_pull_request::MergePullRequestAction;
16pub use push_code::PushCodeAction;
17pub use review_pull_request::ReviewPullRequestAction;
18
19use async_trait::async_trait;
20use serde::{Deserialize, Serialize};
21use serde_json::Value;
22
23use crate::error::Result;
24use crate::GitHubService;
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct ActionContext {
28    pub message: Value,
29    pub owner: String,
30    pub repo: String,
31    pub state: Value,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ActionResult {
36    pub success: bool,
37    pub message: String,
38    pub data: Value,
39}
40
41impl ActionResult {
42    /// Create success result
43    pub fn success(message: impl Into<String>, data: Value) -> Self {
44        Self {
45            success: true,
46            message: message.into(),
47            data,
48        }
49    }
50
51    pub fn error(message: impl Into<String>) -> Self {
52        Self {
53            success: false,
54            message: message.into(),
55            data: Value::Null,
56        }
57    }
58}
59
60#[async_trait]
61pub trait GitHubAction: Send + Sync {
62    fn name(&self) -> &str;
63    fn description(&self) -> &str;
64    fn similes(&self) -> Vec<&str>;
65    async fn validate(&self, context: &ActionContext) -> Result<bool>;
66    async fn handler(
67        &self,
68        context: &ActionContext,
69        service: &GitHubService,
70    ) -> Result<ActionResult>;
71}