#![allow(clippy::all, unused_imports, dead_code)]
//! Auto-generated API actors for GitHub
//!
//! Service: GitHub (github)
//! Code hosting and collaboration platform
//!
//! Required env var: GITHUB_API_KEY (OAuth2 access token)
//!
//! Generated by api-schema-gen codegen — do not edit manually.
use crate::{Actor, ActorBehavior, Message, Port};
use anyhow::{Error, Result};
use reflow_actor::{message::EncodableValue, ActorContext};
use reflow_actor_macro::actor;
use serde_json::{json, Value};
use std::collections::HashMap;
use std::time::Duration;
const BASE_URL: &str = "https://api.github.com";
const ENV_KEY: &str = "GITHUB_API_KEY";
/// Apply authentication to the request builder.
fn apply_auth(
config: &reflow_actor::ActorConfig,
mut builder: reqwest::RequestBuilder,
) -> Result<reqwest::RequestBuilder> {
let credential = config
.get_config_or_env(ENV_KEY)
.ok_or_else(|| anyhow::anyhow!("Missing env var: {}", ENV_KEY))?;
builder = builder.header("Authorization", format!("Bearer {}", credential));
Ok(builder)
}
/// list repositories via GitHub API
///
/// Method: GET /user/repos
#[actor(
GithubListRepositoriesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_repositories(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/repos".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/repos failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create an issue
///
/// Method: POST /repos/{owner}/{repo}/issues
#[actor(
GithubCreateIssueActor,
inports::<100>(owner, repo, title, body, type_, assignees, labels, assignee, milestone),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_issue(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/repos/{owner}/{repo}/issues".to_string();
if let Some(val) = inputs.get("owner") {
endpoint = endpoint.replace("{{owner}}", &super::message_to_str(val));
}
if let Some(val) = inputs.get("repo") {
endpoint = endpoint.replace("{{repo}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("title") {
body.insert("title".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("body") {
body.insert("body".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("type_") {
body.insert("type".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("assignees") {
body.insert("assignees".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("labels") {
body.insert("labels".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("assignee") {
body.insert("assignee".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("milestone") {
body.insert("milestone".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /repos/{{owner}}/{{repo}}/issues failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Create a pull request
///
/// Method: POST /repos/{owner}/{repo}/pulls
#[actor(
GithubCreatePullRequestActor,
inports::<100>(owner, repo, title, head, base, body, head_repo, maintainer_can_modify, draft, issue),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_pull_request(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/repos/{owner}/{repo}/pulls".to_string();
if let Some(val) = inputs.get("owner") {
endpoint = endpoint.replace("{{owner}}", &super::message_to_str(val));
}
if let Some(val) = inputs.get("repo") {
endpoint = endpoint.replace("{{repo}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("title") {
body.insert("title".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("head") {
body.insert("head".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("base") {
body.insert("base".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("body") {
body.insert("body".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("head_repo") {
body.insert("head_repo".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("maintainer_can_modify") {
body.insert("maintainer_can_modify".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("draft") {
body.insert("draft".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("issue") {
body.insert("issue".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /repos/{{owner}}/{{repo}}/pulls failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// GitHub API Root
///
/// Method: GET /
#[actor(
GithubListMetaActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_meta(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET / failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List global security advisories
///
/// Method: GET /advisories
#[actor(
GithubListSecurityAdvisoriesActor,
inports::<100>(ghsa_id, type_, cve_id, ecosystem, severity, cwes, is_withdrawn, affects, published, updated, modified, epss_percentage, epss_percentile, per_page, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_security_advisories(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/advisories".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("ghsa_id") {
query_pairs.push(("ghsa_id", super::message_to_str(val)));
}
if let Some(val) = inputs.get("type_") {
query_pairs.push(("type", super::message_to_str(val)));
}
if let Some(val) = inputs.get("cve_id") {
query_pairs.push(("cve_id", super::message_to_str(val)));
}
if let Some(val) = inputs.get("ecosystem") {
query_pairs.push(("ecosystem", super::message_to_str(val)));
}
if let Some(val) = inputs.get("severity") {
query_pairs.push(("severity", super::message_to_str(val)));
}
if let Some(val) = inputs.get("cwes") {
query_pairs.push(("cwes", super::message_to_str(val)));
}
if let Some(val) = inputs.get("is_withdrawn") {
query_pairs.push(("is_withdrawn", super::message_to_str(val)));
}
if let Some(val) = inputs.get("affects") {
query_pairs.push(("affects", super::message_to_str(val)));
}
if let Some(val) = inputs.get("published") {
query_pairs.push(("published", super::message_to_str(val)));
}
if let Some(val) = inputs.get("updated") {
query_pairs.push(("updated", super::message_to_str(val)));
}
if let Some(val) = inputs.get("modified") {
query_pairs.push(("modified", super::message_to_str(val)));
}
if let Some(val) = inputs.get("epss_percentage") {
query_pairs.push(("epss_percentage", super::message_to_str(val)));
}
if let Some(val) = inputs.get("epss_percentile") {
query_pairs.push(("epss_percentile", super::message_to_str(val)));
}
if let Some(val) = inputs.get("per_page") {
query_pairs.push(("per_page", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /advisories failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get a global security advisory
///
/// Method: GET /advisories/{ghsa_id}
#[actor(
GithubReadSecurityAdvisoriesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_security_advisories(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/advisories/{ghsa_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /advisories/{{ghsa_id}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get the authenticated app
///
/// Method: GET /app
#[actor(
GithubListAppsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_apps(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/app".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /app failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create a GitHub App from a manifest
///
/// Method: POST /app-manifests/{code}/conversions
#[actor(
GithubCreateAppsActor,
inports::<100>(code),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_apps(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/app-manifests/{code}/conversions".to_string();
if let Some(val) = inputs.get("code") {
endpoint = endpoint.replace("{{code}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /app-manifests/{{code}}/conversions failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Update a webhook configuration for an app
///
/// Method: PATCH /app/hook/config
#[actor(
GithubUpdateAppsActor,
inports::<100>(secret, url, insecure_ssl, content_type),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_apps(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/app/hook/config".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("secret") {
body.insert("secret".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("url") {
body.insert("url".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("insecure_ssl") {
body.insert("insecure_ssl".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("content_type") {
body.insert("content_type".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("PATCH /app/hook/config failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get a delivery for an app webhook
///
/// Method: GET /app/hook/deliveries/{delivery_id}
#[actor(
GithubReadAppsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_apps(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/app/hook/deliveries/{delivery_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /app/hook/deliveries/{{delivery_id}} failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Delete an installation for the authenticated app
///
/// Method: DELETE /app/installations/{installation_id}
#[actor(
GithubDeleteAppsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_apps(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/app/installations/{installation_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /app/installations/{{installation_id}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get an assignment
///
/// Method: GET /assignments/{assignment_id}
#[actor(
GithubReadClassroomActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_classroom(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/assignments/{assignment_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /assignments/{{assignment_id}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List classrooms
///
/// Method: GET /classrooms
#[actor(
GithubListClassroomActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_classroom(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/classrooms".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /classrooms failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get all codes of conduct
///
/// Method: GET /codes_of_conduct
#[actor(
GithubListCodesOfConductActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_codes_of_conduct(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/codes_of_conduct".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /codes_of_conduct failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get a code of conduct
///
/// Method: GET /codes_of_conduct/{key}
#[actor(
GithubReadCodesOfConductActor,
inports::<100>(key),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_codes_of_conduct(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/codes_of_conduct/{key}".to_string();
if let Some(val) = inputs.get("key") {
endpoint = endpoint.replace("{{key}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /codes_of_conduct/{{key}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Revoke a list of credentials
///
/// Method: POST /credentials/revoke
#[actor(
GithubCreateCredentialsActor,
inports::<100>(credentials),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_credentials(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/credentials/revoke".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("credentials") {
body.insert("credentials".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /credentials/revoke failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get emojis
///
/// Method: GET /emojis
#[actor(
GithubListEmojisActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_emojis(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/emojis".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /emojis failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get GitHub Actions cache retention limit for an enterprise
///
/// Method: GET /enterprises/{enterprise}/actions/cache/retention-limit
#[actor(
GithubReadActionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_actions(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/actions/cache/retention-limit".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /enterprises/{{enterprise}}/actions/cache/retention-limit failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Set GitHub Actions cache retention limit for an enterprise
///
/// Method: PUT /enterprises/{enterprise}/actions/cache/retention-limit
#[actor(
GithubUpdateActionsActor,
inports::<100>(max_cache_retention_days),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_actions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/actions/cache/retention-limit".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("max_cache_retention_days") {
body.insert("max_cache_retention_days".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PUT /enterprises/{{enterprise}}/actions/cache/retention-limit failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Create a code security configuration for an enterprise
///
/// Method: POST /enterprises/{enterprise}/code-security/configurations
#[actor(
GithubCreateCodeSecurityActor,
inports::<100>(description, code_scanning_delegated_alert_dismissal, dependency_graph_autosubmit_action, dependency_graph_autosubmit_action_options, enforcement, dependabot_alerts, code_security, name, dependency_graph, secret_protection, secret_scanning_delegated_alert_dismissal, code_scanning_default_setup_options, code_scanning_options, advanced_security, code_scanning_default_setup, dependabot_security_updates, private_vulnerability_reporting, secret_scanning_generic_secrets, secret_scanning_non_provider_patterns, secret_scanning_push_protection, secret_scanning, secret_scanning_validity_checks, secret_scanning_extended_metadata),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_code_security(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/code-security/configurations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("code_scanning_delegated_alert_dismissal") {
body.insert(
"code_scanning_delegated_alert_dismissal".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependency_graph_autosubmit_action") {
body.insert(
"dependency_graph_autosubmit_action".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependency_graph_autosubmit_action_options") {
body.insert(
"dependency_graph_autosubmit_action_options".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("enforcement") {
body.insert("enforcement".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("dependabot_alerts") {
body.insert("dependabot_alerts".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("code_security") {
body.insert("code_security".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("dependency_graph") {
body.insert("dependency_graph".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_protection") {
body.insert("secret_protection".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_scanning_delegated_alert_dismissal") {
body.insert(
"secret_scanning_delegated_alert_dismissal".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("code_scanning_default_setup_options") {
body.insert(
"code_scanning_default_setup_options".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("code_scanning_options") {
body.insert("code_scanning_options".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("advanced_security") {
body.insert("advanced_security".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("code_scanning_default_setup") {
body.insert(
"code_scanning_default_setup".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependabot_security_updates") {
body.insert(
"dependabot_security_updates".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("private_vulnerability_reporting") {
body.insert(
"private_vulnerability_reporting".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_generic_secrets") {
body.insert(
"secret_scanning_generic_secrets".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_non_provider_patterns") {
body.insert(
"secret_scanning_non_provider_patterns".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_push_protection") {
body.insert(
"secret_scanning_push_protection".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning") {
body.insert("secret_scanning".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_scanning_validity_checks") {
body.insert(
"secret_scanning_validity_checks".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_extended_metadata") {
body.insert(
"secret_scanning_extended_metadata".to_string(),
val.clone().into(),
);
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /enterprises/{{enterprise}}/code-security/configurations failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get code security configurations for an enterprise
///
/// Method: GET /enterprises/{enterprise}/code-security/configurations
#[actor(
GithubReadCodeSecurityActor,
inports::<100>(per_page),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_code_security(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/code-security/configurations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("per_page") {
query_pairs.push(("per_page", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /enterprises/{{enterprise}}/code-security/configurations failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Delete a code security configuration for an enterprise
///
/// Method: DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}
#[actor(
GithubDeleteCodeSecurityActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_code_security(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/code-security/configurations/{configuration_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /enterprises/{{enterprise}}/code-security/configurations/{{configuration_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Update a custom code security configuration for an enterprise
///
/// Method: PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}
#[actor(
GithubUpdateCodeSecurityActor,
inports::<100>(code_security, advanced_security, private_vulnerability_reporting, secret_scanning_validity_checks, secret_scanning_non_provider_patterns, dependency_graph_autosubmit_action_options, secret_protection, secret_scanning, code_scanning_options, secret_scanning_push_protection, name, code_scanning_delegated_alert_dismissal, code_scanning_default_setup, secret_scanning_delegated_alert_dismissal, dependabot_alerts, secret_scanning_extended_metadata, dependabot_security_updates, description, enforcement, dependency_graph_autosubmit_action, code_scanning_default_setup_options, secret_scanning_generic_secrets, dependency_graph),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_code_security(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/code-security/configurations/{configuration_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("code_security") {
body.insert("code_security".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("advanced_security") {
body.insert("advanced_security".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("private_vulnerability_reporting") {
body.insert(
"private_vulnerability_reporting".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_validity_checks") {
body.insert(
"secret_scanning_validity_checks".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_non_provider_patterns") {
body.insert(
"secret_scanning_non_provider_patterns".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependency_graph_autosubmit_action_options") {
body.insert(
"dependency_graph_autosubmit_action_options".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_protection") {
body.insert("secret_protection".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_scanning") {
body.insert("secret_scanning".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("code_scanning_options") {
body.insert("code_scanning_options".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_scanning_push_protection") {
body.insert(
"secret_scanning_push_protection".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("code_scanning_delegated_alert_dismissal") {
body.insert(
"code_scanning_delegated_alert_dismissal".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("code_scanning_default_setup") {
body.insert(
"code_scanning_default_setup".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_delegated_alert_dismissal") {
body.insert(
"secret_scanning_delegated_alert_dismissal".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependabot_alerts") {
body.insert("dependabot_alerts".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_scanning_extended_metadata") {
body.insert(
"secret_scanning_extended_metadata".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependabot_security_updates") {
body.insert(
"dependabot_security_updates".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("enforcement") {
body.insert("enforcement".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("dependency_graph_autosubmit_action") {
body.insert(
"dependency_graph_autosubmit_action".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("code_scanning_default_setup_options") {
body.insert(
"code_scanning_default_setup_options".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_generic_secrets") {
body.insert(
"secret_scanning_generic_secrets".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependency_graph") {
body.insert("dependency_graph".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PATCH /enterprises/{{enterprise}}/code-security/configurations/{{configuration_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// List Dependabot alerts for an enterprise
///
/// Method: GET /enterprises/{enterprise}/dependabot/alerts
#[actor(
GithubReadDependabotActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_dependabot(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/dependabot/alerts".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /enterprises/{{enterprise}}/dependabot/alerts failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List enterprise teams
///
/// Method: GET /enterprises/{enterprise}/teams
#[actor(
GithubReadEnterpriseTeamsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_enterprise_teams(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /enterprises/{{enterprise}}/teams failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Create an enterprise team
///
/// Method: POST /enterprises/{enterprise}/teams
#[actor(
GithubCreateEnterpriseTeamsActor,
inports::<100>(name, description, group_id, organization_selection_type, sync_to_organizations),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_enterprise_teams(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("group_id") {
body.insert("group_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("organization_selection_type") {
body.insert(
"organization_selection_type".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("sync_to_organizations") {
body.insert("sync_to_organizations".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /enterprises/{{enterprise}}/teams failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// List members in an enterprise team
///
/// Method: GET /enterprises/{enterprise}/teams/{enterprise-team}/memberships
#[actor(
GithubReadEnterpriseTeamMembershipsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_enterprise_team_memberships(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams/{enterprise-team}/memberships".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("GET /enterprises/{{enterprise}}/teams/{{enterprise-team}}/memberships failed: {}", e).into()));
}
}
Ok(output)
}
/// Bulk add team members
///
/// Method: POST /enterprises/{enterprise}/teams/{enterprise-team}/memberships/add
#[actor(
GithubCreateEnterpriseTeamMembershipsActor,
inports::<100>(usernames),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_enterprise_team_memberships(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams/{enterprise-team}/memberships/add".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("usernames") {
body.insert("usernames".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /enterprises/{{enterprise}}/teams/{{enterprise-team}}/memberships/add failed: {}", e).into()));
}
}
Ok(output)
}
/// Add team member
///
/// Method: PUT /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
#[actor(
GithubUpdateEnterpriseTeamMembershipsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_enterprise_team_memberships(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PUT /enterprises/{{enterprise}}/teams/{{enterprise-team}}/memberships/{{username}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Remove team membership
///
/// Method: DELETE /enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}
#[actor(
GithubDeleteEnterpriseTeamMembershipsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_enterprise_team_memberships(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/teams/{enterprise-team}/memberships/{username}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /enterprises/{{enterprise}}/teams/{{enterprise-team}}/memberships/{{username}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Get organization assignments
///
/// Method: GET /enterprises/{enterprise}/teams/{enterprise-team}/organizations
#[actor(
GithubReadEnterpriseTeamOrganizationsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_enterprise_team_organizations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams/{enterprise-team}/organizations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("GET /enterprises/{{enterprise}}/teams/{{enterprise-team}}/organizations failed: {}", e).into()));
}
}
Ok(output)
}
/// Add organization assignments
///
/// Method: POST /enterprises/{enterprise}/teams/{enterprise-team}/organizations/add
#[actor(
GithubCreateEnterpriseTeamOrganizationsActor,
inports::<100>(organization_slugs),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_enterprise_team_organizations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/teams/{enterprise-team}/organizations/add".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("organization_slugs") {
body.insert("organization_slugs".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /enterprises/{{enterprise}}/teams/{{enterprise-team}}/organizations/add failed: {}", e).into()));
}
}
Ok(output)
}
/// Add an organization assignment
///
/// Method: PUT /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}
#[actor(
GithubUpdateEnterpriseTeamOrganizationsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_enterprise_team_organizations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PUT /enterprises/{{enterprise}}/teams/{{enterprise-team}}/organizations/{{org}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete an organization assignment
///
/// Method: DELETE /enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}
#[actor(
GithubDeleteEnterpriseTeamOrganizationsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_enterprise_team_organizations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/enterprises/{enterprise}/teams/{enterprise-team}/organizations/{org}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /enterprises/{{enterprise}}/teams/{{enterprise-team}}/organizations/{{org}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete an enterprise team
///
/// Method: DELETE /enterprises/{enterprise}/teams/{team_slug}
#[actor(
GithubDeleteEnterpriseTeamsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_enterprise_teams(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams/{team_slug}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /enterprises/{{enterprise}}/teams/{{team_slug}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update an enterprise team
///
/// Method: PATCH /enterprises/{enterprise}/teams/{team_slug}
#[actor(
GithubUpdateEnterpriseTeamsActor,
inports::<100>(sync_to_organizations, name, description, group_id, organization_selection_type),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_enterprise_teams(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/enterprises/{enterprise}/teams/{team_slug}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("sync_to_organizations") {
body.insert("sync_to_organizations".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("group_id") {
body.insert("group_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("organization_selection_type") {
body.insert(
"organization_selection_type".to_string(),
val.clone().into(),
);
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /enterprises/{{enterprise}}/teams/{{team_slug}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List public events
///
/// Method: GET /events
#[actor(
GithubListActivityActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_activity(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/events".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /events failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create a gist
///
/// Method: POST /gists
#[actor(
GithubCreateGistsActor,
inports::<100>(public, description, files),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_gists(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/gists".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("public") {
body.insert("public".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("files") {
body.insert("files".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /gists failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List gists for the authenticated user
///
/// Method: GET /gists
#[actor(
GithubListGistsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_gists(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/gists".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /gists failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Delete a gist
///
/// Method: DELETE /gists/{gist_id}
#[actor(
GithubDeleteGistsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_gists(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/gists/{gist_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("DELETE /gists/{{gist_id}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get a gist
///
/// Method: GET /gists/{gist_id}
#[actor(
GithubReadGistsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_gists(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/gists/{gist_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /gists/{{gist_id}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Update a gist
///
/// Method: PATCH /gists/{gist_id}
#[actor(
GithubUpdateGistsActor,
inports::<100>(description, files),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_gists(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/gists/{gist_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("files") {
body.insert("files".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("PATCH /gists/{{gist_id}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get all gitignore templates
///
/// Method: GET /gitignore/templates
#[actor(
GithubListGitignoreActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_gitignore(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/gitignore/templates".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /gitignore/templates failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get a gitignore template
///
/// Method: GET /gitignore/templates/{name}
#[actor(
GithubReadGitignoreActor,
inports::<100>(name),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_gitignore(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/gitignore/templates/{name}".to_string();
if let Some(val) = inputs.get("name") {
endpoint = endpoint.replace("{{name}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /gitignore/templates/{{name}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List issues assigned to the authenticated user
///
/// Method: GET /issues
#[actor(
GithubListIssuesActor,
inports::<100>(filter, state, sort, collab, orgs, owned, pulls),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_issues(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/issues".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("filter") {
query_pairs.push(("filter", super::message_to_str(val)));
}
if let Some(val) = inputs.get("state") {
query_pairs.push(("state", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if let Some(val) = inputs.get("collab") {
query_pairs.push(("collab", super::message_to_str(val)));
}
if let Some(val) = inputs.get("orgs") {
query_pairs.push(("orgs", super::message_to_str(val)));
}
if let Some(val) = inputs.get("owned") {
query_pairs.push(("owned", super::message_to_str(val)));
}
if let Some(val) = inputs.get("pulls") {
query_pairs.push(("pulls", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /issues failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get all commonly used licenses
///
/// Method: GET /licenses
#[actor(
GithubListLicensesActor,
inports::<100>(featured),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_licenses(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/licenses".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("featured") {
query_pairs.push(("featured", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /licenses failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get a license
///
/// Method: GET /licenses/{license}
#[actor(
GithubReadLicensesActor,
inports::<100>(license),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_licenses(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/licenses/{license}".to_string();
if let Some(val) = inputs.get("license") {
endpoint = endpoint.replace("{{license}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /licenses/{{license}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Render a Markdown document
///
/// Method: POST /markdown
#[actor(
GithubCreateMarkdownActor,
inports::<100>(context, mode, text),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_markdown(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/markdown".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("context") {
body.insert("context".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("mode") {
body.insert("mode".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("text") {
body.insert("text".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /markdown failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List public events for a network of repositories
///
/// Method: GET /networks/{owner}/{repo}/events
#[actor(
GithubReadActivityActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_activity(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/networks/{owner}/{repo}/events".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /networks/{{owner}}/{{repo}}/events failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Mark notifications as read
///
/// Method: PUT /notifications
#[actor(
GithubUpdateActivityActor,
inports::<100>(read, last_read_at),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_activity(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/notifications".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("read") {
body.insert("read".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("last_read_at") {
body.insert("last_read_at".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("PUT /notifications failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Mark a thread as done
///
/// Method: DELETE /notifications/threads/{thread_id}
#[actor(
GithubDeleteActivityActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_activity(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/notifications/threads/{thread_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("DELETE /notifications/threads/{{thread_id}} failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// List organizations
///
/// Method: GET /organizations
#[actor(
GithubListOrgsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_orgs(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/organizations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /organizations failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Updates Dependabot's repository access list for an organization
///
/// Method: PATCH /organizations/{org}/dependabot/repository-access
#[actor(
GithubUpdateDependabotActor,
inports::<100>(repository_ids_to_add, repository_ids_to_remove),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_dependabot(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/organizations/{org}/dependabot/repository-access".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("repository_ids_to_add") {
body.insert("repository_ids_to_add".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("repository_ids_to_remove") {
body.insert("repository_ids_to_remove".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /organizations/{{org}}/dependabot/repository-access failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get all budgets for an organization
///
/// Method: GET /organizations/{org}/settings/billing/budgets
#[actor(
GithubReadBillingActor,
inports::<100>(page, per_page, scope),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_billing(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/organizations/{org}/settings/billing/budgets".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("page") {
query_pairs.push(("page", super::message_to_str(val)));
}
if let Some(val) = inputs.get("per_page") {
query_pairs.push(("per_page", super::message_to_str(val)));
}
if let Some(val) = inputs.get("scope") {
query_pairs.push(("scope", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /organizations/{{org}}/settings/billing/budgets failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update a budget for an organization
///
/// Method: PATCH /organizations/{org}/settings/billing/budgets/{budget_id}
#[actor(
GithubUpdateBillingActor,
inports::<100>(budget_amount, budget_product_sku, budget_scope, budget_type, budget_alerting, budget_entity_name, prevent_further_usage),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_billing(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/organizations/{org}/settings/billing/budgets/{budget_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("budget_amount") {
body.insert("budget_amount".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("budget_product_sku") {
body.insert("budget_product_sku".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("budget_scope") {
body.insert("budget_scope".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("budget_type") {
body.insert("budget_type".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("budget_alerting") {
body.insert("budget_alerting".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("budget_entity_name") {
body.insert("budget_entity_name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("prevent_further_usage") {
body.insert("prevent_further_usage".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PATCH /organizations/{{org}}/settings/billing/budgets/{{budget_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete a budget for an organization
///
/// Method: DELETE /organizations/{org}/settings/billing/budgets/{budget_id}
#[actor(
GithubDeleteBillingActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_billing(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/organizations/{org}/settings/billing/budgets/{budget_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /organizations/{{org}}/settings/billing/budgets/{{budget_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Get an organization
///
/// Method: GET /orgs/{org}
#[actor(
GithubReadOrgsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_orgs(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Delete an organization
///
/// Method: DELETE /orgs/{org}
#[actor(
GithubDeleteOrgsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_orgs(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("DELETE /orgs/{{org}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Update an organization
///
/// Method: PATCH /orgs/{org}
#[actor(
GithubUpdateOrgsActor,
inports::<100>(has_repository_projects, members_can_fork_private_repositories, advanced_security_enabled_for_new_repositories, secret_scanning_push_protection_custom_link, dependabot_security_updates_enabled_for_new_repositories, deploy_keys_enabled_for_repositories, members_allowed_repository_creation_type, secret_scanning_enabled_for_new_repositories, members_can_create_public_pages, description, twitter_username, secret_scanning_push_protection_enabled_for_new_repositories, members_can_create_pages, dependency_graph_enabled_for_new_repositories, default_repository_permission, web_commit_signoff_required, name, blog, members_can_create_private_repositories, members_can_create_public_repositories, dependabot_alerts_enabled_for_new_repositories, billing_email, members_can_create_private_pages, secret_scanning_push_protection_custom_link_enabled, company, email, location, members_can_create_internal_repositories, members_can_create_repositories, has_organization_projects),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_orgs(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("has_repository_projects") {
body.insert("has_repository_projects".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("members_can_fork_private_repositories") {
body.insert(
"members_can_fork_private_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("advanced_security_enabled_for_new_repositories") {
body.insert(
"advanced_security_enabled_for_new_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_push_protection_custom_link") {
body.insert(
"secret_scanning_push_protection_custom_link".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependabot_security_updates_enabled_for_new_repositories") {
body.insert(
"dependabot_security_updates_enabled_for_new_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("deploy_keys_enabled_for_repositories") {
body.insert(
"deploy_keys_enabled_for_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("members_allowed_repository_creation_type") {
body.insert(
"members_allowed_repository_creation_type".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_enabled_for_new_repositories") {
body.insert(
"secret_scanning_enabled_for_new_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("members_can_create_public_pages") {
body.insert(
"members_can_create_public_pages".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("twitter_username") {
body.insert("twitter_username".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("secret_scanning_push_protection_enabled_for_new_repositories") {
body.insert(
"secret_scanning_push_protection_enabled_for_new_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("members_can_create_pages") {
body.insert("members_can_create_pages".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("dependency_graph_enabled_for_new_repositories") {
body.insert(
"dependency_graph_enabled_for_new_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("default_repository_permission") {
body.insert(
"default_repository_permission".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("web_commit_signoff_required") {
body.insert(
"web_commit_signoff_required".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("blog") {
body.insert("blog".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("members_can_create_private_repositories") {
body.insert(
"members_can_create_private_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("members_can_create_public_repositories") {
body.insert(
"members_can_create_public_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("dependabot_alerts_enabled_for_new_repositories") {
body.insert(
"dependabot_alerts_enabled_for_new_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("billing_email") {
body.insert("billing_email".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("members_can_create_private_pages") {
body.insert(
"members_can_create_private_pages".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("secret_scanning_push_protection_custom_link_enabled") {
body.insert(
"secret_scanning_push_protection_custom_link_enabled".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("company") {
body.insert("company".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("email") {
body.insert("email".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("location") {
body.insert("location".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("members_can_create_internal_repositories") {
body.insert(
"members_can_create_internal_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("members_can_create_repositories") {
body.insert(
"members_can_create_repositories".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("has_organization_projects") {
body.insert("has_organization_projects".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("PATCH /orgs/{{org}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create a GitHub-hosted runner for an organization
///
/// Method: POST /orgs/{org}/actions/hosted-runners
#[actor(
GithubCreateActionsActor,
inports::<100>(name, enable_static_ip, runner_group_id, size, maximum_runners, image_gen, image),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_actions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/actions/hosted-runners".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("enable_static_ip") {
body.insert("enable_static_ip".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("runner_group_id") {
body.insert("runner_group_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("size") {
body.insert("size".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("maximum_runners") {
body.insert("maximum_runners".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("image_gen") {
body.insert("image_gen".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("image") {
body.insert("image".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /orgs/{{org}}/actions/hosted-runners failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Delete a custom image from the organization
///
/// Method: DELETE /orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}
#[actor(
GithubDeleteActionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_actions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/orgs/{org}/actions/hosted-runners/images/custom/{image_definition_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /orgs/{{org}}/actions/hosted-runners/images/custom/{{image_definition_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Get the customization template for an OIDC subject claim for an organization
///
/// Method: GET /orgs/{org}/actions/oidc/customization/sub
#[actor(
GithubReadOidcActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_oidc(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/actions/oidc/customization/sub".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /orgs/{{org}}/actions/oidc/customization/sub failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Set the customization template for an OIDC subject claim for an organization
///
/// Method: PUT /orgs/{org}/actions/oidc/customization/sub
#[actor(
GithubUpdateOidcActor,
inports::<100>(include_claim_keys),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_oidc(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/actions/oidc/customization/sub".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("include_claim_keys") {
body.insert("include_claim_keys".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PUT /orgs/{{org}}/actions/oidc/customization/sub failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Create an artifact deployment record
///
/// Method: POST /orgs/{org}/artifacts/metadata/deployment-record
#[actor(
GithubCreateOrgsActor,
inports::<100>(tags, cluster, deployment_name, digest, logical_environment, status, version, name, github_repository, physical_environment, runtime_risks),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_orgs(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/artifacts/metadata/deployment-record".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("tags") {
body.insert("tags".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cluster") {
body.insert("cluster".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("deployment_name") {
body.insert("deployment_name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("digest") {
body.insert("digest".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("logical_environment") {
body.insert("logical_environment".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("status") {
body.insert("status".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("version") {
body.insert("version".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("github_repository") {
body.insert("github_repository".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("physical_environment") {
body.insert("physical_environment".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("runtime_risks") {
body.insert("runtime_risks".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /orgs/{{org}}/artifacts/metadata/deployment-record failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List campaigns for an organization
///
/// Method: GET /orgs/{org}/campaigns
#[actor(
GithubReadCampaignsActor,
inports::<100>(state, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_campaigns(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/campaigns".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("state") {
query_pairs.push(("state", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/campaigns failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create a campaign for an organization
///
/// Method: POST /orgs/{org}/campaigns
#[actor(
GithubCreateCampaignsActor,
inports::<100>(team_managers, managers, contact_link, code_scanning_alerts, generate_issues, ends_at, name, description),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_campaigns(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/campaigns".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("team_managers") {
body.insert("team_managers".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("managers") {
body.insert("managers".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("contact_link") {
body.insert("contact_link".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("code_scanning_alerts") {
body.insert("code_scanning_alerts".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("generate_issues") {
body.insert("generate_issues".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("ends_at") {
body.insert("ends_at".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /orgs/{{org}}/campaigns failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Update a campaign
///
/// Method: PATCH /orgs/{org}/campaigns/{campaign_number}
#[actor(
GithubUpdateCampaignsActor,
inports::<100>(campaign_number, description, name, contact_link, team_managers, managers, state, ends_at),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_campaigns(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/orgs/{org}/campaigns/{campaign_number}".to_string();
if let Some(val) = inputs.get("campaign_number") {
endpoint = endpoint.replace("{{campaign_number}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("contact_link") {
body.insert("contact_link".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("team_managers") {
body.insert("team_managers".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("managers") {
body.insert("managers".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("state") {
body.insert("state".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("ends_at") {
body.insert("ends_at".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /orgs/{{org}}/campaigns/{{campaign_number}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Delete a campaign for an organization
///
/// Method: DELETE /orgs/{org}/campaigns/{campaign_number}
#[actor(
GithubDeleteCampaignsActor,
inports::<100>(campaign_number),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_campaigns(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/orgs/{org}/campaigns/{campaign_number}".to_string();
if let Some(val) = inputs.get("campaign_number") {
endpoint = endpoint.replace("{{campaign_number}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /orgs/{{org}}/campaigns/{{campaign_number}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List code scanning alerts for an organization
///
/// Method: GET /orgs/{org}/code-scanning/alerts
#[actor(
GithubReadCodeScanningActor,
inports::<100>(state, sort, severity, assignees),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_code_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/code-scanning/alerts".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("state") {
query_pairs.push(("state", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if let Some(val) = inputs.get("severity") {
query_pairs.push(("severity", super::message_to_str(val)));
}
if let Some(val) = inputs.get("assignees") {
query_pairs.push(("assignees", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /orgs/{{org}}/code-scanning/alerts failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// List codespaces for the organization
///
/// Method: GET /orgs/{org}/codespaces
#[actor(
GithubReadCodespacesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/codespaces".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/codespaces failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create or update an organization secret
///
/// Method: PUT /orgs/{org}/codespaces/secrets/{secret_name}
#[actor(
GithubUpdateCodespacesActor,
inports::<100>(selected_repository_ids, visibility, key_id, encrypted_value),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/codespaces/secrets/{secret_name}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("selected_repository_ids") {
body.insert("selected_repository_ids".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("visibility") {
body.insert("visibility".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("key_id") {
body.insert("key_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("encrypted_value") {
body.insert("encrypted_value".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PUT /orgs/{{org}}/codespaces/secrets/{{secret_name}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Delete an organization secret
///
/// Method: DELETE /orgs/{org}/codespaces/secrets/{secret_name}
#[actor(
GithubDeleteCodespacesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/codespaces/secrets/{secret_name}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /orgs/{{org}}/codespaces/secrets/{{secret_name}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get Copilot seat information and settings for an organization
///
/// Method: GET /orgs/{org}/copilot/billing
#[actor(
GithubReadCopilotActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_copilot(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/copilot/billing".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/copilot/billing failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Add teams to the Copilot subscription for an organization
///
/// Method: POST /orgs/{org}/copilot/billing/selected_teams
#[actor(
GithubCreateCopilotActor,
inports::<100>(selected_teams),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_copilot(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/copilot/billing/selected_teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("selected_teams") {
body.insert("selected_teams".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /orgs/{{org}}/copilot/billing/selected_teams failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Remove teams from the Copilot subscription for an organization
///
/// Method: DELETE /orgs/{org}/copilot/billing/selected_teams
#[actor(
GithubDeleteCopilotActor,
inports::<100>(selected_teams),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_copilot(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/copilot/billing/selected_teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /orgs/{{org}}/copilot/billing/selected_teams failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Set Copilot content exclusion rules for an organization
///
/// Method: PUT /orgs/{org}/copilot/content_exclusion
#[actor(
GithubUpdateCopilotActor,
inports::<100>(body),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_copilot(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/copilot/content_exclusion".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("body") {
body.insert("body".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("PUT /orgs/{{org}}/copilot/content_exclusion failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Delete an organization secret
///
/// Method: DELETE /orgs/{org}/dependabot/secrets/{secret_name}
#[actor(
GithubDeleteDependabotActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_dependabot(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/dependabot/secrets/{secret_name}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /orgs/{{org}}/dependabot/secrets/{{secret_name}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get list of conflicting packages during Docker migration for organization
///
/// Method: GET /orgs/{org}/docker/conflicts
#[actor(
GithubReadPackagesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_packages(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/docker/conflicts".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/docker/conflicts failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get interaction restrictions for an organization
///
/// Method: GET /orgs/{org}/interaction-limits
#[actor(
GithubReadInteractionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_interactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/interaction-limits".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /orgs/{{org}}/interaction-limits failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Set interaction restrictions for an organization
///
/// Method: PUT /orgs/{org}/interaction-limits
#[actor(
GithubUpdateInteractionsActor,
inports::<100>(expiry, limit),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_interactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/interaction-limits".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("expiry") {
body.insert("expiry".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("limit") {
body.insert("limit".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("PUT /orgs/{{org}}/interaction-limits failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Remove interaction restrictions for an organization
///
/// Method: DELETE /orgs/{org}/interaction-limits
#[actor(
GithubDeleteInteractionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_interactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/interaction-limits".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("DELETE /orgs/{{org}}/interaction-limits failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// List organization issues assigned to the authenticated user
///
/// Method: GET /orgs/{org}/issues
#[actor(
GithubReadIssuesActor,
inports::<100>(filter, state, type_, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_issues(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/issues".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("filter") {
query_pairs.push(("filter", super::message_to_str(val)));
}
if let Some(val) = inputs.get("state") {
query_pairs.push(("state", super::message_to_str(val)));
}
if let Some(val) = inputs.get("type_") {
query_pairs.push(("type", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/issues failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Stop a codespace for an organization user
///
/// Method: POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop
#[actor(
GithubStopCodespacesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_stop_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/members/{username}/codespaces/{codespace_name}/stop".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /orgs/{{org}}/members/{{username}}/codespaces/{{codespace_name}}/stop failed: {}", e).into()));
}
}
Ok(output)
}
/// List organization migrations
///
/// Method: GET /orgs/{org}/migrations
#[actor(
GithubReadMigrationsActor,
inports::<100>(exclude),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_migrations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/migrations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("exclude") {
query_pairs.push(("exclude", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/migrations failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Start an organization migration
///
/// Method: POST /orgs/{org}/migrations
#[actor(
GithubCreateMigrationsActor,
inports::<100>(exclude_git_data, exclude_owner_projects, org_metadata_only, exclude_attachments, repositories, exclude, exclude_releases, exclude_metadata, lock_repositories),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_migrations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/migrations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("exclude_git_data") {
body.insert("exclude_git_data".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("exclude_owner_projects") {
body.insert("exclude_owner_projects".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("org_metadata_only") {
body.insert("org_metadata_only".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("exclude_attachments") {
body.insert("exclude_attachments".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("repositories") {
body.insert("repositories".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("exclude") {
body.insert("exclude".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("exclude_releases") {
body.insert("exclude_releases".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("exclude_metadata") {
body.insert("exclude_metadata".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("lock_repositories") {
body.insert("lock_repositories".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /orgs/{{org}}/migrations failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Delete an organization migration archive
///
/// Method: DELETE /orgs/{org}/migrations/{migration_id}/archive
#[actor(
GithubArchiveMigrationsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_archive_migrations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/migrations/{migration_id}/archive".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /orgs/{{org}}/migrations/{{migration_id}}/archive failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Unlock an organization repository
///
/// Method: DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock
#[actor(
GithubLockMigrationsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_lock_migrations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /orgs/{{org}}/migrations/{{migration_id}}/repos/{{repo_name}}/lock failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete a package for an organization
///
/// Method: DELETE /orgs/{org}/packages/{package_type}/{package_name}
#[actor(
GithubDeletePackagesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_packages(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/packages/{package_type}/{package_name}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /orgs/{{org}}/packages/{{package_type}}/{{package_name}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Restore a package for an organization
///
/// Method: POST /orgs/{org}/packages/{package_type}/{package_name}/restore
#[actor(
GithubRestorePackagesActor,
inports::<100>(token),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_restore_packages(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/packages/{package_type}/{package_name}/restore".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("token") {
query_pairs.push(("token", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /orgs/{{org}}/packages/{{package_type}}/{{package_name}}/restore failed: {}", e).into()));
}
}
Ok(output)
}
/// Create a private registry for an organization
///
/// Method: POST /orgs/{org}/private-registries
#[actor(
GithubCreatePrivateRegistriesActor,
inports::<100>(replaces_base, key_id, registry_type, url, selected_repository_ids, encrypted_value, visibility, username),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_private_registries(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/private-registries".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("replaces_base") {
body.insert("replaces_base".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("key_id") {
body.insert("key_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("registry_type") {
body.insert("registry_type".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("url") {
body.insert("url".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("selected_repository_ids") {
body.insert("selected_repository_ids".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("encrypted_value") {
body.insert("encrypted_value".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("visibility") {
body.insert("visibility".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("username") {
body.insert("username".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /orgs/{{org}}/private-registries failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// List private registries for an organization
///
/// Method: GET /orgs/{org}/private-registries
#[actor(
GithubReadPrivateRegistriesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_private_registries(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/private-registries".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /orgs/{{org}}/private-registries failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Update a private registry for an organization
///
/// Method: PATCH /orgs/{org}/private-registries/{secret_name}
#[actor(
GithubUpdatePrivateRegistriesActor,
inports::<100>(key_id, selected_repository_ids, replaces_base, encrypted_value, visibility, registry_type, url, username),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_private_registries(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/private-registries/{secret_name}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("key_id") {
body.insert("key_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("selected_repository_ids") {
body.insert("selected_repository_ids".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("replaces_base") {
body.insert("replaces_base".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("encrypted_value") {
body.insert("encrypted_value".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("visibility") {
body.insert("visibility".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("registry_type") {
body.insert("registry_type".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("url") {
body.insert("url".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("username") {
body.insert("username".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /orgs/{{org}}/private-registries/{{secret_name}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Delete a private registry for an organization
///
/// Method: DELETE /orgs/{org}/private-registries/{secret_name}
#[actor(
GithubDeletePrivateRegistriesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_private_registries(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/private-registries/{secret_name}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /orgs/{{org}}/private-registries/{{secret_name}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List projects for organization
///
/// Method: GET /orgs/{org}/projectsV2
#[actor(
GithubReadProjectsActor,
inports::<100>(q),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_projects(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/projectsV2".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/projectsV2 failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create draft item for organization owned project
///
/// Method: POST /orgs/{org}/projectsV2/{project_number}/drafts
#[actor(
GithubCreateProjectsActor,
inports::<100>(body, title),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_projects(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/projectsV2/{project_number}/drafts".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("body") {
body.insert("body".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("title") {
body.insert("title".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /orgs/{{org}}/projectsV2/{{project_number}}/drafts failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update project item for organization
///
/// Method: PATCH /orgs/{org}/projectsV2/{project_number}/items/{item_id}
#[actor(
GithubUpdateProjectsActor,
inports::<100>(fields),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_projects(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/projectsV2/{project_number}/items/{item_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("fields") {
body.insert("fields".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PATCH /orgs/{{org}}/projectsV2/{{project_number}}/items/{{item_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete project item for organization
///
/// Method: DELETE /orgs/{org}/projectsV2/{project_number}/items/{item_id}
#[actor(
GithubDeleteProjectsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_projects(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/projectsV2/{project_number}/items/{item_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /orgs/{{org}}/projectsV2/{{project_number}}/items/{{item_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// List organization repositories
///
/// Method: GET /orgs/{org}/repos
#[actor(
GithubReadReposActor,
inports::<100>(type_, sort, direction),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/repos".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("type_") {
query_pairs.push(("type", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if let Some(val) = inputs.get("direction") {
query_pairs.push(("direction", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/repos failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create an organization repository
///
/// Method: POST /orgs/{org}/repos
#[actor(
GithubCreateReposActor,
inports::<100>(team_id, allow_squash_merge, gitignore_template, license_template, name, has_wiki, description, private, has_projects, allow_merge_commit, delete_branch_on_merge, homepage, use_squash_pr_title_as_default, merge_commit_message, visibility, has_downloads, merge_commit_title, allow_rebase_merge, auto_init, is_template, custom_properties, allow_auto_merge, has_issues, squash_merge_commit_message, squash_merge_commit_title),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/repos".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("team_id") {
body.insert("team_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("allow_squash_merge") {
body.insert("allow_squash_merge".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("gitignore_template") {
body.insert("gitignore_template".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("license_template") {
body.insert("license_template".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("has_wiki") {
body.insert("has_wiki".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("private") {
body.insert("private".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("has_projects") {
body.insert("has_projects".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("allow_merge_commit") {
body.insert("allow_merge_commit".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("delete_branch_on_merge") {
body.insert("delete_branch_on_merge".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("homepage") {
body.insert("homepage".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("use_squash_pr_title_as_default") {
body.insert(
"use_squash_pr_title_as_default".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("merge_commit_message") {
body.insert("merge_commit_message".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("visibility") {
body.insert("visibility".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("has_downloads") {
body.insert("has_downloads".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("merge_commit_title") {
body.insert("merge_commit_title".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("allow_rebase_merge") {
body.insert("allow_rebase_merge".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("auto_init") {
body.insert("auto_init".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("is_template") {
body.insert("is_template".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("custom_properties") {
body.insert("custom_properties".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("allow_auto_merge") {
body.insert("allow_auto_merge".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("has_issues") {
body.insert("has_issues".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("squash_merge_commit_message") {
body.insert(
"squash_merge_commit_message".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("squash_merge_commit_title") {
body.insert("squash_merge_commit_title".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /orgs/{{org}}/repos failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Delete an organization repository ruleset
///
/// Method: DELETE /orgs/{org}/rulesets/{ruleset_id}
#[actor(
GithubDeleteReposActor,
inports::<100>(ruleset_id),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/orgs/{org}/rulesets/{ruleset_id}".to_string();
if let Some(val) = inputs.get("ruleset_id") {
endpoint = endpoint.replace("{{ruleset_id}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("DELETE /orgs/{{org}}/rulesets/{{ruleset_id}} failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Update an organization repository ruleset
///
/// Method: PUT /orgs/{org}/rulesets/{ruleset_id}
#[actor(
GithubUpdateReposActor,
inports::<100>(ruleset_id, rules, conditions, bypass_actors, target, name, enforcement),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/orgs/{org}/rulesets/{ruleset_id}".to_string();
if let Some(val) = inputs.get("ruleset_id") {
endpoint = endpoint.replace("{{ruleset_id}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.put(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("rules") {
body.insert("rules".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("conditions") {
body.insert("conditions".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("bypass_actors") {
body.insert("bypass_actors".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("target") {
body.insert("target".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("enforcement") {
body.insert("enforcement".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("PUT /orgs/{{org}}/rulesets/{{ruleset_id}} failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// List secret scanning alerts for an organization
///
/// Method: GET /orgs/{org}/secret-scanning/alerts
#[actor(
GithubReadSecretScanningActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_secret_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/secret-scanning/alerts".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("GET /orgs/{{org}}/secret-scanning/alerts failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Update organization pattern configurations
///
/// Method: PATCH /orgs/{org}/secret-scanning/pattern-configurations
#[actor(
GithubUpdateSecretScanningActor,
inports::<100>(provider_pattern_settings, custom_pattern_settings, pattern_config_version),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_secret_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/secret-scanning/pattern-configurations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("provider_pattern_settings") {
body.insert("provider_pattern_settings".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("custom_pattern_settings") {
body.insert("custom_pattern_settings".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("pattern_config_version") {
body.insert("pattern_config_version".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /orgs/{{org}}/secret-scanning/pattern-configurations failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List hosted compute network configurations for an organization
///
/// Method: GET /orgs/{org}/settings/network-configurations
#[actor(
GithubReadHostedComputeActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_hosted_compute(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/settings/network-configurations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /orgs/{{org}}/settings/network-configurations failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Create a hosted compute network configuration for an organization
///
/// Method: POST /orgs/{org}/settings/network-configurations
#[actor(
GithubCreateHostedComputeActor,
inports::<100>(name, compute_service, network_settings_ids),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_hosted_compute(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/settings/network-configurations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("compute_service") {
body.insert("compute_service".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("network_settings_ids") {
body.insert("network_settings_ids".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /orgs/{{org}}/settings/network-configurations failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update a hosted compute network configuration for an organization
///
/// Method: PATCH /orgs/{org}/settings/network-configurations/{network_configuration_id}
#[actor(
GithubUpdateHostedComputeActor,
inports::<100>(compute_service, name, network_settings_ids),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_hosted_compute(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/orgs/{org}/settings/network-configurations/{network_configuration_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("compute_service") {
body.insert("compute_service".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("network_settings_ids") {
body.insert("network_settings_ids".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PATCH /orgs/{{org}}/settings/network-configurations/{{network_configuration_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete a hosted compute network configuration from an organization
///
/// Method: DELETE /orgs/{org}/settings/network-configurations/{network_configuration_id}
#[actor(
GithubDeleteHostedComputeActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_hosted_compute(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/orgs/{org}/settings/network-configurations/{network_configuration_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /orgs/{{org}}/settings/network-configurations/{{network_configuration_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// List teams
///
/// Method: GET /orgs/{org}/teams
#[actor(
GithubReadTeamsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_teams(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /orgs/{{org}}/teams failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create a team
///
/// Method: POST /orgs/{org}/teams
#[actor(
GithubCreateTeamsActor,
inports::<100>(privacy, name, parent_team_id, permission, maintainers, notification_setting, repo_names, description),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_teams(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("privacy") {
body.insert("privacy".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("parent_team_id") {
body.insert("parent_team_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("permission") {
body.insert("permission".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("maintainers") {
body.insert("maintainers".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("notification_setting") {
body.insert("notification_setting".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("repo_names") {
body.insert("repo_names".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /orgs/{{org}}/teams failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Update a team
///
/// Method: PATCH /orgs/{org}/teams/{team_slug}
#[actor(
GithubUpdateTeamsActor,
inports::<100>(description, privacy, notification_setting, parent_team_id, permission, name),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_teams(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/teams/{team_slug}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("privacy") {
body.insert("privacy".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("notification_setting") {
body.insert("notification_setting".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("parent_team_id") {
body.insert("parent_team_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("permission") {
body.insert("permission".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("PATCH /orgs/{{org}}/teams/{{team_slug}} failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Delete a team
///
/// Method: DELETE /orgs/{org}/teams/{team_slug}
#[actor(
GithubDeleteTeamsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_teams(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/orgs/{org}/teams/{team_slug}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("DELETE /orgs/{{org}}/teams/{{team_slug}} failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Get rate limit status for the authenticated user
///
/// Method: GET /rate_limit
#[actor(
GithubListRateLimitActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_rate_limit(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/rate_limit".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /rate_limit failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Approve a workflow run for a fork pull request
///
/// Method: POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve
#[actor(
GithubApproveActionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_approve_actions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/actions/runs/{run_id}/approve".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /repos/{{owner}}/{{repo}}/actions/runs/{{run_id}}/approve failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Cancel a workflow run
///
/// Method: POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel
#[actor(
GithubCancelActionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_cancel_actions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/actions/runs/{run_id}/cancel".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /repos/{{owner}}/{{repo}}/actions/runs/{{run_id}}/cancel failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Create a check run
///
/// Method: POST /repos/{owner}/{repo}/check-runs
#[actor(
GithubCreateChecksActor,
inports::<100>(conclusion, details_url, external_id, started_at, head_sha, actions, name, completed_at, output, status),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_checks(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/check-runs".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("conclusion") {
body.insert("conclusion".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("details_url") {
body.insert("details_url".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("external_id") {
body.insert("external_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("started_at") {
body.insert("started_at".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("head_sha") {
body.insert("head_sha".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("actions") {
body.insert("actions".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("completed_at") {
body.insert("completed_at".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("output") {
body.insert("output".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("status") {
body.insert("status".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /repos/{{owner}}/{{repo}}/check-runs failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Update a check run
///
/// Method: PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}
#[actor(
GithubUpdateChecksActor,
inports::<100>(output, actions, name, completed_at, external_id, conclusion, started_at, status, details_url),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_checks(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/check-runs/{check_run_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("output") {
body.insert("output".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("actions") {
body.insert("actions".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("completed_at") {
body.insert("completed_at".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("external_id") {
body.insert("external_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("conclusion") {
body.insert("conclusion".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("started_at") {
body.insert("started_at".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("status") {
body.insert("status".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("details_url") {
body.insert("details_url".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /repos/{{owner}}/{{repo}}/check-runs/{{check_run_id}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get a check run
///
/// Method: GET /repos/{owner}/{repo}/check-runs/{check_run_id}
#[actor(
GithubReadChecksActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_checks(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/check-runs/{check_run_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /repos/{{owner}}/{{repo}}/check-runs/{{check_run_id}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update a code scanning alert
///
/// Method: PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}
#[actor(
GithubUpdateCodeScanningActor,
inports::<100>(assignees, create_request, dismissed_reason, state, dismissed_comment),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_code_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("assignees") {
body.insert("assignees".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("create_request") {
body.insert("create_request".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("dismissed_reason") {
body.insert("dismissed_reason".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("state") {
body.insert("state".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("dismissed_comment") {
body.insert("dismissed_comment".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PATCH /repos/{{owner}}/{{repo}}/code-scanning/alerts/{{alert_number}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Create an autofix for a code scanning alert
///
/// Method: POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix
#[actor(
GithubCreateCodeScanningActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_code_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /repos/{{owner}}/{{repo}}/code-scanning/alerts/{{alert_number}}/autofix failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete a code scanning analysis from a repository
///
/// Method: DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}
#[actor(
GithubDeleteCodeScanningActor,
inports::<100>(analysis_id, confirm_delete),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_code_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}".to_string();
if let Some(val) = inputs.get("analysis_id") {
endpoint = endpoint.replace("{{analysis_id}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("confirm_delete") {
query_pairs.push(("confirm_delete", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /repos/{{owner}}/{{repo}}/code-scanning/analyses/{{analysis_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Create a codespace in a repository
///
/// Method: POST /repos/{owner}/{repo}/codespaces
#[actor(
GithubCreateCodespacesActor,
inports::<100>(working_directory, machine, ref_, idle_timeout_minutes, display_name, geo, location, retention_period_minutes, multi_repo_permissions_opt_out, devcontainer_path, client_ip),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/codespaces".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("working_directory") {
body.insert("working_directory".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("machine") {
body.insert("machine".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("ref_") {
body.insert("ref".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("idle_timeout_minutes") {
body.insert("idle_timeout_minutes".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("display_name") {
body.insert("display_name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("geo") {
body.insert("geo".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("location") {
body.insert("location".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("retention_period_minutes") {
body.insert("retention_period_minutes".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("multi_repo_permissions_opt_out") {
body.insert(
"multi_repo_permissions_opt_out".to_string(),
val.clone().into(),
);
}
if let Some(val) = inputs.get("devcontainer_path") {
body.insert("devcontainer_path".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("client_ip") {
body.insert("client_ip".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /repos/{{owner}}/{{repo}}/codespaces failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Create reaction for a commit comment
///
/// Method: POST /repos/{owner}/{repo}/comments/{comment_id}/reactions
#[actor(
GithubCreateReactionsActor,
inports::<100>(content),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_reactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/comments/{comment_id}/reactions".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("content") {
body.insert("content".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /repos/{{owner}}/{{repo}}/comments/{{comment_id}}/reactions failed: {}", e).into()));
}
}
Ok(output)
}
/// List reactions for a commit comment
///
/// Method: GET /repos/{owner}/{repo}/comments/{comment_id}/reactions
#[actor(
GithubReadReactionsActor,
inports::<100>(content),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_reactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/comments/{comment_id}/reactions".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("content") {
query_pairs.push(("content", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("GET /repos/{{owner}}/{{repo}}/comments/{{comment_id}}/reactions failed: {}", e).into()));
}
}
Ok(output)
}
/// Delete a commit comment reaction
///
/// Method: DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}
#[actor(
GithubDeleteReactionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_reactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /repos/{{owner}}/{{repo}}/comments/{{comment_id}}/reactions/{{reaction_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Get a diff of the dependencies between commits
///
/// Method: GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}
#[actor(
GithubReadDependencyGraphActor,
inports::<100>(basehead),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_dependency_graph(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/repos/{owner}/{repo}/dependency-graph/compare/{basehead}".to_string();
if let Some(val) = inputs.get("basehead") {
endpoint = endpoint.replace("{{basehead}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("GET /repos/{{owner}}/{{repo}}/dependency-graph/compare/{{basehead}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Create a snapshot of dependencies for a repository
///
/// Method: POST /repos/{owner}/{repo}/dependency-graph/snapshots
#[actor(
GithubCreateDependencyGraphActor,
inports::<100>(scanned, sha, version, manifests, job, metadata, ref_, detector),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_dependency_graph(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/dependency-graph/snapshots".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("scanned") {
body.insert("scanned".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("sha") {
body.insert("sha".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("version") {
body.insert("version".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("manifests") {
body.insert("manifests".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("job") {
body.insert("job".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("metadata") {
body.insert("metadata".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("ref_") {
body.insert("ref".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("detector") {
body.insert("detector".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /repos/{{owner}}/{{repo}}/dependency-graph/snapshots failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Create a blob
///
/// Method: POST /repos/{owner}/{repo}/git/blobs
#[actor(
GithubCreateGitActor,
inports::<100>(encoding, content),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_git(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/git/blobs".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("encoding") {
body.insert("encoding".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("content") {
body.insert("content".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!("POST /repos/{{owner}}/{{repo}}/git/blobs failed: {}", e).into(),
),
);
}
}
Ok(output)
}
/// Get a blob
///
/// Method: GET /repos/{owner}/{repo}/git/blobs/{file_sha}
#[actor(
GithubReadGitActor,
inports::<100>(file_sha),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_git(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/repos/{owner}/{repo}/git/blobs/{file_sha}".to_string();
if let Some(val) = inputs.get("file_sha") {
endpoint = endpoint.replace("{{file_sha}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /repos/{{owner}}/{{repo}}/git/blobs/{{file_sha}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Delete a reference
///
/// Method: DELETE /repos/{owner}/{repo}/git/refs/{ref}
#[actor(
GithubDeleteGitActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_git(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/git/refs/{ref}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /repos/{{owner}}/{{repo}}/git/refs/{{ref}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update a reference
///
/// Method: PATCH /repos/{owner}/{repo}/git/refs/{ref}
#[actor(
GithubUpdateGitActor,
inports::<100>(sha, force),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_git(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/git/refs/{ref}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("sha") {
body.insert("sha".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("force") {
body.insert("force".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /repos/{{owner}}/{{repo}}/git/refs/{{ref}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update an issue comment
///
/// Method: PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}
#[actor(
GithubUpdateIssuesActor,
inports::<100>(body),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_issues(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/issues/comments/{comment_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("body") {
body.insert("body".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /repos/{{owner}}/{{repo}}/issues/comments/{{comment_id}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Delete an issue comment
///
/// Method: DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}
#[actor(
GithubDeleteIssuesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_issues(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/issues/comments/{comment_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("DELETE /repos/{{owner}}/{{repo}}/issues/comments/{{comment_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Unlock an issue
///
/// Method: DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock
#[actor(
GithubLockIssuesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_lock_issues(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/issues/{issue_number}/lock".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /repos/{{owner}}/{{repo}}/issues/{{issue_number}}/lock failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Cancel a GitHub Pages deployment
///
/// Method: POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel
#[actor(
GithubCancelReposActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_cancel_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint =
"/repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /repos/{{owner}}/{{repo}}/pages/deployments/{{pages_deployment_id}}/cancel failed: {}", e).into()));
}
}
Ok(output)
}
/// List pull requests
///
/// Method: GET /repos/{owner}/{repo}/pulls
#[actor(
GithubReadPullsActor,
inports::<100>(state, head, base, sort, direction),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_pulls(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/pulls".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("state") {
query_pairs.push(("state", super::message_to_str(val)));
}
if let Some(val) = inputs.get("head") {
query_pairs.push(("head", super::message_to_str(val)));
}
if let Some(val) = inputs.get("base") {
query_pairs.push(("base", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if let Some(val) = inputs.get("direction") {
query_pairs.push(("direction", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /repos/{{owner}}/{{repo}}/pulls failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Delete a review comment for a pull request
///
/// Method: DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}
#[actor(
GithubDeletePullsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_pulls(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/pulls/comments/{comment_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"DELETE /repos/{{owner}}/{{repo}}/pulls/comments/{{comment_id}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update a review comment for a pull request
///
/// Method: PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}
#[actor(
GithubUpdatePullsActor,
inports::<100>(body),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_pulls(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/pulls/comments/{comment_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("body") {
body.insert("body".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"PATCH /repos/{{owner}}/{{repo}}/pulls/comments/{{comment_id}} failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Check if a pull request has been merged
///
/// Method: GET /repos/{owner}/{repo}/pulls/{pull_number}/merge
#[actor(
GithubMergePullsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_merge_pulls(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/pulls/{pull_number}/merge".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"GET /repos/{{owner}}/{{repo}}/pulls/{{pull_number}}/merge failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Create a push protection bypass
///
/// Method: POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses
#[actor(
GithubCreateSecretScanningActor,
inports::<100>(placeholder_id, reason),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_secret_scanning(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/secret-scanning/push-protection-bypasses".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("placeholder_id") {
body.insert("placeholder_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("reason") {
body.insert("reason".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("POST /repos/{{owner}}/{{repo}}/secret-scanning/push-protection-bypasses failed: {}", e).into()));
}
}
Ok(output)
}
/// Create a repository security advisory
///
/// Method: POST /repos/{owner}/{repo}/security-advisories
#[actor(
GithubCreateSecurityAdvisoriesActor,
inports::<100>(summary, severity, cvss_vector_string, cwe_ids, description, credits, vulnerabilities, start_private_fork, cve_id),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_security_advisories(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/security-advisories".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("summary") {
body.insert("summary".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("severity") {
body.insert("severity".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cvss_vector_string") {
body.insert("cvss_vector_string".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cwe_ids") {
body.insert("cwe_ids".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("credits") {
body.insert("credits".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("vulnerabilities") {
body.insert("vulnerabilities".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("start_private_fork") {
body.insert("start_private_fork".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cve_id") {
body.insert("cve_id".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /repos/{{owner}}/{{repo}}/security-advisories failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Update a repository security advisory
///
/// Method: PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}
#[actor(
GithubUpdateSecurityAdvisoriesActor,
inports::<100>(collaborating_users, description, collaborating_teams, cve_id, cwe_ids, summary, state, cvss_vector_string, credits, severity, vulnerabilities),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_security_advisories(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repos/{owner}/{repo}/security-advisories/{ghsa_id}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("collaborating_users") {
body.insert("collaborating_users".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("collaborating_teams") {
body.insert("collaborating_teams".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cve_id") {
body.insert("cve_id".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cwe_ids") {
body.insert("cwe_ids".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("summary") {
body.insert("summary".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("state") {
body.insert("state".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("cvss_vector_string") {
body.insert("cvss_vector_string".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("credits") {
body.insert("credits".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("severity") {
body.insert("severity".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("vulnerabilities") {
body.insert("vulnerabilities".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert("error".to_string(), Message::Error(format!("PATCH /repos/{{owner}}/{{repo}}/security-advisories/{{ghsa_id}} failed: {}", e).into()));
}
}
Ok(output)
}
/// Create a repository using a template
///
/// Method: POST /repos/{template_owner}/{template_repo}/generate
#[actor(
GithubGenerateReposActor,
inports::<100>(template_owner, template_repo, owner, name, private, include_all_branches, description),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_generate_repos(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let mut endpoint = "/repos/{template_owner}/{template_repo}/generate".to_string();
if let Some(val) = inputs.get("template_owner") {
endpoint = endpoint.replace("{{template_owner}}", &super::message_to_str(val));
}
if let Some(val) = inputs.get("template_repo") {
endpoint = endpoint.replace("{{template_repo}}", &super::message_to_str(val));
}
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("owner") {
body.insert("owner".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("private") {
body.insert("private".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("include_all_branches") {
body.insert("include_all_branches".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("description") {
body.insert("description".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /repos/{{template_owner}}/{{template_repo}}/generate failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// List public repositories
///
/// Method: GET /repositories
#[actor(
GithubListReposActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/repositories".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /repositories failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search code
///
/// Method: GET /search/code
#[actor(
GithubSearchCodeActor,
inports::<100>(q, sort, order),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_code(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/code".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if let Some(val) = inputs.get("order") {
query_pairs.push(("order", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/code failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search commits
///
/// Method: GET /search/commits
#[actor(
GithubSearchCommitsActor,
inports::<100>(q, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_commits(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/commits".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/commits failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search issues and pull requests
///
/// Method: GET /search/issues
#[actor(
GithubSearchIssuesAndPullRequestsActor,
inports::<100>(q, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_issues_and_pull_requests(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/issues".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/issues failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search labels
///
/// Method: GET /search/labels
#[actor(
GithubSearchLabelsActor,
inports::<100>(repository_id, q, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_labels(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/labels".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("repository_id") {
query_pairs.push(("repository_id", super::message_to_str(val)));
}
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/labels failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search repositories
///
/// Method: GET /search/repositories
#[actor(
GithubSearchReposActor,
inports::<100>(q, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_repos(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/repositories".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/repositories failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search topics
///
/// Method: GET /search/topics
#[actor(
GithubSearchTopicsActor,
inports::<100>(q),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_topics(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/topics".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/topics failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Search users
///
/// Method: GET /search/users
#[actor(
GithubSearchUsersActor,
inports::<100>(q, sort),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_search_users(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/search/users".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut query_pairs: Vec<(&str, String)> = Vec::new();
if let Some(val) = inputs.get("q") {
query_pairs.push(("q", super::message_to_str(val)));
}
if let Some(val) = inputs.get("sort") {
query_pairs.push(("sort", super::message_to_str(val)));
}
if !query_pairs.is_empty() {
builder = builder.query(&query_pairs);
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /search/users failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Update the authenticated user
///
/// Method: PATCH /user
#[actor(
GithubUpdateUsersActor,
inports::<100>(email, bio, company, blog, twitter_username, location, hireable, name),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_update_users(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.patch(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("email") {
body.insert("email".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("bio") {
body.insert("bio".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("company") {
body.insert("company".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("blog") {
body.insert("blog".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("twitter_username") {
body.insert("twitter_username".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("location") {
body.insert("location".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("hireable") {
body.insert("hireable".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("PATCH /user failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get the authenticated user
///
/// Method: GET /user
#[actor(
GithubListUsersActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_users(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Unblock a user
///
/// Method: DELETE /user/blocks/{username}
#[actor(
GithubDeleteUsersActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_delete_users(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/blocks/{username}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.delete(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("DELETE /user/blocks/{{username}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Check if a user is blocked by the authenticated user
///
/// Method: GET /user/blocks/{username}
#[actor(
GithubReadUsersActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_read_users(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/blocks/{username}".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/blocks/{{username}} failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List codespaces for the authenticated user
///
/// Method: GET /user/codespaces
#[actor(
GithubListCodespacesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/codespaces".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/codespaces failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Create a repository from an unpublished codespace
///
/// Method: POST /user/codespaces/{codespace_name}/publish
#[actor(
GithubPublishCodespacesActor,
inports::<100>(name, private),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_publish_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/codespaces/{codespace_name}/publish".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut body = serde_json::Map::new();
if let Some(val) = inputs.get("name") {
body.insert("name".to_string(), val.clone().into());
}
if let Some(val) = inputs.get("private") {
body.insert("private".to_string(), val.clone().into());
}
if !body.is_empty() {
builder = builder.json(&serde_json::Value::Object(body));
}
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /user/codespaces/{{codespace_name}}/publish failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Start a codespace for the authenticated user
///
/// Method: POST /user/codespaces/{codespace_name}/start
#[actor(
GithubStartCodespacesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_start_codespaces(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/codespaces/{codespace_name}/start".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(
format!(
"POST /user/codespaces/{{codespace_name}}/start failed: {}",
e
)
.into(),
),
);
}
}
Ok(output)
}
/// Get list of conflicting packages during Docker migration for authenticated-user
///
/// Method: GET /user/docker/conflicts
#[actor(
GithubListPackagesActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_packages(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/docker/conflicts".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/docker/conflicts failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Add an email address for the authenticated user
///
/// Method: POST /user/emails
#[actor(
GithubCreateUsersActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_create_users(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/emails".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.post(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("POST /user/emails failed: {}", e).into()),
);
}
}
Ok(output)
}
/// Get interaction restrictions for your public repositories
///
/// Method: GET /user/interaction-limits
#[actor(
GithubListInteractionsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_interactions(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/interaction-limits".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/interaction-limits failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List user migrations
///
/// Method: GET /user/migrations
#[actor(
GithubListMigrationsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_migrations(
context: ActorContext,
) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/migrations".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/migrations failed: {}", e).into()),
);
}
}
Ok(output)
}
/// List teams for the authenticated user
///
/// Method: GET /user/teams
#[actor(
GithubListTeamsActor,
inports::<100>(trigger),
outports::<50>(response, error),
state(MemoryState)
)]
pub async fn github_list_teams(context: ActorContext) -> Result<HashMap<String, Message>, Error> {
let inputs = context.get_payload();
let actor_config = context.get_config();
let endpoint = "/user/teams".to_string();
let url = format!("{}{}", BASE_URL.trim_end_matches('/'), endpoint);
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(30))
.build()?;
let mut builder = client.get(&url);
builder = builder.header("Content-Type", "application/json");
builder = apply_auth(actor_config, builder)?;
let mut output = HashMap::new();
match builder.send().await {
Ok(resp) => {
let status = resp.status().as_u16();
let headers: HashMap<String, String> = resp
.headers()
.iter()
.filter_map(|(k, v)| v.to_str().ok().map(|val| (k.to_string(), val.to_string())))
.collect();
let body_text = resp.text().await.unwrap_or_default();
let body_value: Value =
serde_json::from_str(&body_text).unwrap_or(Value::String(body_text));
output.insert(
"response".to_string(),
Message::object(EncodableValue::from(json!({
"status": status,
"headers": headers,
"body": body_value,
}))),
);
}
Err(e) => {
output.insert(
"error".to_string(),
Message::Error(format!("GET /user/teams failed: {}", e).into()),
);
}
}
Ok(output)
}