use autoschematic_core::{connector::Resource, macros::FieldTypes, util::RON};
use autoschematic_macros::FieldTypes;
use documented::{Documented, DocumentedFields};
use ron::ser::PrettyConfig;
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum GithubRepositoryOwner {
User(String),
Organization(String),
}
#[derive(Debug, PartialEq, Serialize, Deserialize, Documented, DocumentedFields, Clone, FieldTypes)]
#[serde(deny_unknown_fields)]
pub struct GitHubConnectorConfig {
pub orgs: Vec<String>,
pub users: Vec<String>,
pub enterprise_url: Option<String>,
pub concurrent_requests: usize,
}
impl Default for GitHubConnectorConfig {
fn default() -> Self {
Self {
orgs: Vec::new(),
users: Vec::new(),
enterprise_url: None,
concurrent_requests: 5,
}
}
}
impl GitHubConnectorConfig {
pub fn try_load(prefix: &Path) -> anyhow::Result<Option<Self>> {
let config_path = prefix.join("github").join("config.ron");
if !config_path.exists() {
return Ok(None);
}
let config_str = std::fs::read_to_string(&config_path)?;
let config: GitHubConnectorConfig = RON.from_str(&config_str)?;
Ok(Some(config))
}
}
impl Resource for GitHubConnectorConfig {
fn to_bytes(&self) -> anyhow::Result<Vec<u8>> {
Ok(RON.to_string_pretty(self, PrettyConfig::default())?.into())
}
fn from_bytes(_addr: &impl autoschematic_core::connector::ResourceAddress, s: &[u8]) -> anyhow::Result<Self>
where
Self: Sized,
{
Ok(RON.from_str(str::from_utf8(s)?)?)
}
}