diff options
Diffstat (limited to 'src/bin/ngit/sub_commands/init.rs')
| -rw-r--r-- | src/bin/ngit/sub_commands/init.rs | 106 |
1 files changed, 8 insertions, 98 deletions
diff --git a/src/bin/ngit/sub_commands/init.rs b/src/bin/ngit/sub_commands/init.rs index eaaf83d..01fcaea 100644 --- a/src/bin/ngit/sub_commands/init.rs +++ b/src/bin/ngit/sub_commands/init.rs | |||
| @@ -12,12 +12,12 @@ use console::{Style, Term}; | |||
| 12 | use dialoguer::theme::{ColorfulTheme, Theme}; | 12 | use dialoguer::theme::{ColorfulTheme, Theme}; |
| 13 | use ngit::{ | 13 | use ngit::{ |
| 14 | UrlWithoutSlash, | 14 | UrlWithoutSlash, |
| 15 | cli_interactor::{PromptChoiceParms, PromptConfirmParms, PromptMultiChoiceParms}, | 15 | cli_interactor::{PromptChoiceParms, PromptConfirmParms, multi_select_with_custom_value}, |
| 16 | client::{Params, send_events}, | 16 | client::{Params, send_events}, |
| 17 | git::nostr_url::{CloneUrl, NostrUrlDecoded}, | 17 | git::nostr_url::{CloneUrl, NostrUrlDecoded}, |
| 18 | repo_ref::{ | 18 | repo_ref::{ |
| 19 | detect_existing_grasp_servers, extract_npub, extract_pks, normalize_grasp_server_url, | 19 | detect_existing_grasp_servers, extract_npub, extract_pks, |
| 20 | save_repo_config_to_yaml, | 20 | format_grasp_server_url_as_relay_url, normalize_grasp_server_url, save_repo_config_to_yaml, |
| 21 | }, | 21 | }, |
| 22 | }; | 22 | }; |
| 23 | use nostr::{ | 23 | use nostr::{ |
| @@ -727,6 +727,11 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> { | |||
| 727 | web, | 727 | web, |
| 728 | relays: relays.clone(), | 728 | relays: relays.clone(), |
| 729 | blossoms, | 729 | blossoms, |
| 730 | hashtags: if let Some(repo_ref) = repo_ref { | ||
| 731 | repo_ref.hashtags | ||
| 732 | } else { | ||
| 733 | vec![] | ||
| 734 | }, | ||
| 730 | trusted_maintainer: user_ref.public_key, | 735 | trusted_maintainer: user_ref.public_key, |
| 731 | maintainers_without_annoucnement: None, | 736 | maintainers_without_annoucnement: None, |
| 732 | maintainers: maintainers.clone(), | 737 | maintainers: maintainers.clone(), |
| @@ -848,93 +853,6 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs) -> Result<()> { | |||
| 848 | Ok(()) | 853 | Ok(()) |
| 849 | } | 854 | } |
| 850 | 855 | ||
| 851 | fn multi_select_with_custom_value<F>( | ||
| 852 | prompt: &str, | ||
| 853 | custom_choice_prompt: &str, | ||
| 854 | mut choices: Vec<String>, | ||
| 855 | mut defaults: Vec<bool>, | ||
| 856 | validate_choice: F, | ||
| 857 | ) -> Result<Vec<String>> | ||
| 858 | where | ||
| 859 | F: Fn(&str) -> Result<String>, | ||
| 860 | { | ||
| 861 | let mut selected_choices = vec![]; | ||
| 862 | |||
| 863 | // Loop to allow users to add more choices | ||
| 864 | loop { | ||
| 865 | // Add 'add another' option at the end of the choices | ||
| 866 | let mut current_choices = choices.clone(); | ||
| 867 | current_choices.push(if current_choices.is_empty() { | ||
| 868 | "add".to_string() | ||
| 869 | } else { | ||
| 870 | "add another".to_string() | ||
| 871 | }); | ||
| 872 | |||
| 873 | // Create default selections based on the provided defaults | ||
| 874 | let mut current_defaults = defaults.clone(); | ||
| 875 | current_defaults.push(current_choices.len() == 1); // 'add another' should not be selected by default | ||
| 876 | |||
| 877 | // Prompt for selections | ||
| 878 | let selected_indices: Vec<usize> = Interactor::default().multi_choice( | ||
| 879 | PromptMultiChoiceParms::default() | ||
| 880 | .with_prompt(prompt) | ||
| 881 | .dont_report() | ||
| 882 | .with_choices(current_choices.clone()) | ||
| 883 | .with_defaults(current_defaults), | ||
| 884 | )?; | ||
| 885 | |||
| 886 | // Collect selected choices | ||
| 887 | selected_choices.clear(); // Clear previous selections to update | ||
| 888 | for &index in &selected_indices { | ||
| 889 | if index < choices.len() { | ||
| 890 | // Exclude 'add another' option | ||
| 891 | selected_choices.push(choices[index].clone()); | ||
| 892 | } | ||
| 893 | } | ||
| 894 | |||
| 895 | // Check if 'add another' was selected | ||
| 896 | if selected_indices.contains(&(choices.len())) { | ||
| 897 | // Last index is 'add another' | ||
| 898 | let mut new_choice: String; | ||
| 899 | loop { | ||
| 900 | new_choice = Interactor::default().input( | ||
| 901 | PromptInputParms::default() | ||
| 902 | .with_prompt(custom_choice_prompt) | ||
| 903 | .dont_report() | ||
| 904 | .optional(), | ||
| 905 | )?; | ||
| 906 | |||
| 907 | if new_choice.is_empty() { | ||
| 908 | break; | ||
| 909 | } | ||
| 910 | // Validate the new choice | ||
| 911 | match validate_choice(&new_choice) { | ||
| 912 | Ok(valid_choice) => { | ||
| 913 | new_choice = valid_choice; // Use the fixed version of the input | ||
| 914 | break; // Valid choice, exit the loop | ||
| 915 | } | ||
| 916 | Err(err) => { | ||
| 917 | // Inform the user about the validation error | ||
| 918 | println!("Error: {err}"); | ||
| 919 | } | ||
| 920 | } | ||
| 921 | } | ||
| 922 | |||
| 923 | // Add the new choice to the choices vector | ||
| 924 | if !new_choice.is_empty() { | ||
| 925 | choices.push(new_choice.clone()); // Add new choice to the end of the list | ||
| 926 | selected_choices.push(new_choice); // Automatically select the new choice | ||
| 927 | defaults.push(true); // Set the new choice as selected by default | ||
| 928 | } | ||
| 929 | } else { | ||
| 930 | // Exit the loop if 'add another' was not selected | ||
| 931 | break; | ||
| 932 | } | ||
| 933 | } | ||
| 934 | |||
| 935 | Ok(selected_choices) | ||
| 936 | } | ||
| 937 | |||
| 938 | fn format_grasp_server_url_as_clone_url( | 856 | fn format_grasp_server_url_as_clone_url( |
| 939 | url: &str, | 857 | url: &str, |
| 940 | public_key: &PublicKey, | 858 | public_key: &PublicKey, |
| @@ -953,14 +871,6 @@ fn format_grasp_server_url_as_clone_url( | |||
| 953 | )) | 871 | )) |
| 954 | } | 872 | } |
| 955 | 873 | ||
| 956 | fn format_grasp_server_url_as_relay_url(url: &str) -> Result<String> { | ||
| 957 | let grasp_server_url = normalize_grasp_server_url(url)?; | ||
| 958 | if grasp_server_url.contains("http://") { | ||
| 959 | return Ok(grasp_server_url.replace("http://", "ws://")); | ||
| 960 | } | ||
| 961 | Ok(format!("wss://{grasp_server_url}")) | ||
| 962 | } | ||
| 963 | |||
| 964 | fn format_grasp_server_url_as_blossom_url(url: &str) -> Result<String> { | 874 | fn format_grasp_server_url_as_blossom_url(url: &str) -> Result<String> { |
| 965 | let grasp_server_url = normalize_grasp_server_url(url)?; | 875 | let grasp_server_url = normalize_grasp_server_url(url)?; |
| 966 | if grasp_server_url.contains("http://") { | 876 | if grasp_server_url.contains("http://") { |