summaryrefslogtreecommitdiffstats
path: root/src/user.rs
diff options
context:
space:
mode:
authorCyborus <cyborus@cyborus.xyz>2024-07-08 21:18:27 +0200
committerCyborus <cyborus@cyborus.xyz>2024-07-08 21:18:27 +0200
commit5313777c7d06f0a6e4ec087af1100b5e6d03b637 (patch)
treeaff1e2548e199932786208978b0060c2da46d8df /src/user.rs
parentfeat(user): user search (diff)
downloadforgejo-cli-5313777c7d06f0a6e4ec087af1100b5e6d03b637.tar.xz
forgejo-cli-5313777c7d06f0a6e4ec087af1100b5e6d03b637.zip
feat(user): editing settings
Diffstat (limited to 'src/user.rs')
-rw-r--r--src/user.rs254
1 files changed, 254 insertions, 0 deletions
diff --git a/src/user.rs b/src/user.rs
index 86af8be..4d920e6 100644
--- a/src/user.rs
+++ b/src/user.rs
@@ -66,6 +66,77 @@ pub enum UserSubcommand {
/// The name of the user to view org membership of
user: Option<String>,
},
+ #[clap(subcommand)]
+ Edit(EditCommand),
+}
+
+#[derive(Subcommand, Clone, Debug)]
+pub enum EditCommand {
+ /// Set your bio
+ Bio {
+ /// The new description. Leave this out to open your editor.
+ content: Option<String>,
+ },
+ /// Set your full name
+ Name {
+ /// The new name.
+ #[clap(group = "arg")]
+ name: Option<String>,
+ /// Remove your name from your profile
+ #[clap(long, short, group = "arg")]
+ unset: bool,
+ },
+ /// Set your pronouns
+ Pronouns {
+ /// The new pronouns.
+ #[clap(group = "arg")]
+ pronouns: Option<String>,
+ /// Remove your pronouns from your profile
+ #[clap(long, short, group = "arg")]
+ unset: bool,
+ },
+ /// Set your activity visibility
+ Location {
+ /// The new location.
+ #[clap(group = "arg")]
+ location: Option<String>,
+ /// Remove your location from your profile
+ #[clap(long, short, group = "arg")]
+ unset: bool,
+ },
+ /// Set your activity visibility
+ Activity {
+ /// The visibility of your activity.
+ #[clap(long, short)]
+ visibility: VisbilitySetting,
+ },
+ /// Manage the email addresses associated with your account
+ Email {
+ /// Set the visibility of your email address.
+ #[clap(long, short)]
+ visibility: Option<VisbilitySetting>,
+ /// Add a new email address
+ #[clap(long, short)]
+ add: Vec<String>,
+ /// Remove an email address
+ #[clap(long, short)]
+ rm: Vec<String>,
+ },
+ /// Set your linked website
+ Website {
+ /// Your website URL.
+ #[clap(group = "arg")]
+ url: Option<String>,
+ /// Remove your website from your profile
+ #[clap(long, short, group = "arg")]
+ unset: bool,
+ },
+}
+
+#[derive(clap::ValueEnum, Clone, Debug, PartialEq, Eq)]
+pub enum VisbilitySetting {
+ Hidden,
+ Public,
}
impl UserCommand {
@@ -90,6 +161,23 @@ impl UserCommand {
sort,
} => list_repos(&api, user.as_deref(), starred, sort).await?,
UserSubcommand::Orgs { user } => list_orgs(&api, user.as_deref()).await?,
+ UserSubcommand::Edit(cmd) => match cmd {
+ EditCommand::Bio { content } => edit_bio(&api, content).await?,
+ EditCommand::Name { name, unset } => edit_name(&api, name, unset).await?,
+ EditCommand::Pronouns { pronouns, unset } => {
+ edit_pronouns(&api, pronouns, unset).await?
+ }
+ EditCommand::Location { location, unset } => {
+ edit_location(&api, location, unset).await?
+ }
+ EditCommand::Activity { visibility } => edit_activity(&api, visibility).await?,
+ EditCommand::Email {
+ visibility,
+ add,
+ rm,
+ } => edit_email(&api, visibility, add, rm).await?,
+ EditCommand::Website { url, unset } => edit_website(&api, url, unset).await?,
+ },
}
Ok(())
}
@@ -486,3 +574,169 @@ async fn list_orgs(api: &Forgejo, user: Option<&str>) -> eyre::Result<()> {
}
Ok(())
}
+
+fn default_settings_opt() -> forgejo_api::structs::UserSettingsOptions {
+ forgejo_api::structs::UserSettingsOptions {
+ description: None,
+ diff_view_style: None,
+ enable_repo_unit_hints: None,
+ full_name: None,
+ hide_activity: None,
+ hide_email: None,
+ language: None,
+ location: None,
+ pronouns: None,
+ theme: None,
+ website: None,
+ }
+}
+
+async fn edit_bio(api: &Forgejo, new_bio: Option<String>) -> eyre::Result<()> {
+ let new_bio = match new_bio {
+ Some(s) => s,
+ None => {
+ let mut bio = api
+ .user_get_current()
+ .await?
+ .description
+ .unwrap_or_default();
+ crate::editor(&mut bio, Some("md")).await?;
+ bio
+ }
+ };
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ description: Some(new_bio),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ Ok(())
+}
+
+async fn edit_name(api: &Forgejo, new_name: Option<String>, unset: bool) -> eyre::Result<()> {
+ match (new_name, unset) {
+ (Some(_), true) => unreachable!(),
+ (Some(name), false) if !name.is_empty() => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ full_name: Some(name),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ (None, true) => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ full_name: Some(String::new()),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ _ => println!("Use --unset to remove your name from your profile"),
+ }
+ Ok(())
+}
+
+async fn edit_pronouns(
+ api: &Forgejo,
+ new_pronouns: Option<String>,
+ unset: bool,
+) -> eyre::Result<()> {
+ match (new_pronouns, unset) {
+ (Some(_), true) => unreachable!(),
+ (Some(pronouns), false) if !pronouns.is_empty() => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ pronouns: Some(pronouns),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ (None, true) => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ pronouns: Some(String::new()),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ _ => println!("Use --unset to remove your pronouns from your profile"),
+ }
+ Ok(())
+}
+
+async fn edit_location(
+ api: &Forgejo,
+ new_location: Option<String>,
+ unset: bool,
+) -> eyre::Result<()> {
+ match (new_location, unset) {
+ (Some(_), true) => unreachable!(),
+ (Some(location), false) if !location.is_empty() => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ location: Some(location),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ (None, true) => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ location: Some(String::new()),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ _ => println!("Use --unset to remove your location from your profile"),
+ }
+ Ok(())
+}
+
+async fn edit_activity(api: &Forgejo, visibility: VisbilitySetting) -> eyre::Result<()> {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ hide_activity: Some(visibility == VisbilitySetting::Hidden),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ Ok(())
+}
+
+async fn edit_email(
+ api: &Forgejo,
+ visibility: Option<VisbilitySetting>,
+ add: Vec<String>,
+ rm: Vec<String>,
+) -> eyre::Result<()> {
+ if let Some(vis) = visibility {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ hide_activity: Some(vis == VisbilitySetting::Hidden),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ if !add.is_empty() {
+ let opt = forgejo_api::structs::CreateEmailOption { emails: Some(add) };
+ api.user_add_email(opt).await?;
+ }
+ if !rm.is_empty() {
+ let opt = forgejo_api::structs::DeleteEmailOption { emails: Some(rm) };
+ api.user_delete_email(opt).await?;
+ }
+ Ok(())
+}
+
+async fn edit_website(api: &Forgejo, new_url: Option<String>, unset: bool) -> eyre::Result<()> {
+ match (new_url, unset) {
+ (Some(_), true) => unreachable!(),
+ (Some(url), false) if !url.is_empty() => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ website: Some(url),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ (None, true) => {
+ let opt = forgejo_api::structs::UserSettingsOptions {
+ website: Some(String::new()),
+ ..default_settings_opt()
+ };
+ api.update_user_settings(opt).await?;
+ }
+ _ => println!("Use --unset to remove your name from your profile"),
+ }
+ Ok(())
+}