SYMBOL INDEX (1329 symbols across 42 files) FILE: src/auth.rs function get_quota_project (line 33) | pub fn get_quota_project() -> Option { function adc_well_known_path (line 65) | fn adc_well_known_path() -> Option { type Credential (line 75) | enum Credential { type AccessTokenProvider (line 85) | pub trait AccessTokenProvider: Send + Sync { method access_token (line 86) | async fn access_token(&self) -> anyhow::Result; method access_token (line 108) | async fn access_token(&self) -> anyhow::Result { method access_token (line 138) | async fn access_token(&self) -> anyhow::Result { type ScopedTokenProvider (line 94) | pub struct ScopedTokenProvider { method new (line 99) | pub fn new(scopes: &[&str]) -> Self { function token_provider (line 114) | pub fn token_provider(scopes: &[&str]) -> ScopedTokenProvider { type FakeTokenProvider (line 120) | pub struct FakeTokenProvider { method new (line 126) | pub fn new(tokens: impl IntoIterator) -> Self { function get_token (line 158) | pub async fn get_token(scopes: &[&str]) -> anyhow::Result { function get_token_inner (line 176) | async fn get_token_inner( function parse_credential_file (line 228) | async fn parse_credential_file( function load_credentials_inner (line 256) | async fn load_credentials_inner( type EnvVarGuard (line 365) | struct EnvVarGuard { method set (line 372) | fn set(name: &str, value: impl AsRef) -> Self { method remove (line 382) | fn remove(name: &str) -> Self { method drop (line 393) | fn drop(&mut self) { function test_load_credentials_no_options (line 403) | async fn test_load_credentials_no_options() { function test_load_credentials_adc_env_var_authorized_user (line 426) | async fn test_load_credentials_adc_env_var_authorized_user() { function test_load_credentials_adc_env_var_service_account (line 459) | async fn test_load_credentials_adc_env_var_service_account() { function test_load_credentials_adc_env_var_missing_file (line 498) | async fn test_load_credentials_adc_env_var_missing_file() { function test_load_credentials_env_file_missing (line 519) | async fn test_load_credentials_env_file_missing() { function test_load_credentials_env_file_authorized_user (line 531) | async fn test_load_credentials_env_file_authorized_user() { function test_load_credentials_env_file_service_account (line 559) | async fn test_load_credentials_env_file_service_account() { function test_load_credentials_default_path_authorized_user (line 590) | async fn test_load_credentials_default_path_authorized_user() { function test_get_token_from_env_var (line 614) | async fn test_get_token_from_env_var() { function test_scoped_token_provider_uses_get_token (line 625) | async fn test_scoped_token_provider_uses_get_token() { function test_load_credentials_encrypted_file (line 637) | async fn test_load_credentials_encrypted_file() { function test_load_credentials_encrypted_takes_priority_over_default (line 668) | async fn test_load_credentials_encrypted_takes_priority_over_default() { function test_load_credentials_corrupt_encrypted_file_is_removed (line 708) | async fn test_load_credentials_corrupt_encrypted_file_is_removed() { function test_load_credentials_corrupt_encrypted_falls_through_to_plaintext (line 742) | async fn test_load_credentials_corrupt_encrypted_falls_through_to_plaint... function test_get_token_env_var_empty_falls_through (line 781) | async fn test_get_token_env_var_empty_falls_through() { function test_get_quota_project_priority_env_var (line 808) | fn test_get_quota_project_priority_env_var() { function test_get_quota_project_priority_config (line 819) | fn test_get_quota_project_priority_config() { function test_get_quota_project_priority_adc_fallback (line 837) | fn test_get_quota_project_priority_adc_fallback() { function test_get_quota_project_reads_adc (line 857) | fn test_get_quota_project_reads_adc() { FILE: src/auth_commands.rs function mask_secret (line 25) | fn mask_secret(s: &str) -> String { constant MINIMAL_SCOPES (line 46) | pub const MINIMAL_SCOPES: &[&str] = &[ constant DEFAULT_SCOPES (line 63) | pub const DEFAULT_SCOPES: &[&str] = MINIMAL_SCOPES; constant FULL_SCOPES (line 71) | pub const FULL_SCOPES: &[&str] = &[ constant READONLY_SCOPES (line 84) | const READONLY_SCOPES: &[&str] = &[ function config_dir (line 94) | pub fn config_dir() -> PathBuf { function plain_credentials_path (line 120) | fn plain_credentials_path() -> PathBuf { function token_cache_path (line 127) | fn token_cache_path() -> PathBuf { function handle_auth_command (line 132) | pub async fn handle_auth_command(args: &[String]) -> Result<(), GwsError> { function run_login (line 174) | pub async fn run_login(args: &[String]) -> Result<(), GwsError> { type CliFlowDelegate (line 179) | struct CliFlowDelegate { method present_user_url (line 184) | fn present_user_url<'a>( function handle_login (line 213) | async fn handle_login(args: &[String]) -> Result<(), GwsError> { function fetch_userinfo_email (line 386) | async fn fetch_userinfo_email(access_token: &str) -> Option { function handle_export (line 406) | async fn handle_export(unmasked: bool) -> Result<(), GwsError> { function resolve_client_credentials (line 441) | fn resolve_client_credentials() -> Result<(String, String, Option) ->... function map_service_to_scope_prefixes (line 568) | fn map_service_to_scope_prefixes(service: &str) -> Vec<&str> { function filter_redundant_restrictive_scopes (line 585) | fn filter_redundant_restrictive_scopes(scopes: Vec) -> Vec bool { function is_recommended_scope (line 643) | fn is_recommended_scope( function run_discovery_scope_picker (line 659) | fn run_discovery_scope_picker( function run_simple_scope_picker (line 884) | fn run_simple_scope_picker(services_filter: Option<&HashSet>) ->... function handle_status (line 932) | async fn handle_status() -> Result<(), GwsError> { function handle_logout (line 1183) | fn handle_logout() -> Result<(), GwsError> { function extract_refresh_token (line 1230) | pub fn extract_refresh_token(token_data: &str) -> Option { type ScopeEntry (line 1261) | struct ScopeEntry { constant SCOPE_ENTRIES (line 1266) | const SCOPE_ENTRIES: &[ScopeEntry] = &[ function is_app_only_scope (line 1309) | fn is_app_only_scope(url: &str) -> bool { function is_workspace_admin_scope (line 1330) | fn is_workspace_admin_scope(url: &str) -> bool { function find_unmatched_services (line 1347) | fn find_unmatched_services(scopes: &[String], services: &HashSet... function extract_scopes_from_doc (line 1378) | fn extract_scopes_from_doc( function fetch_scopes_for_unmatched_services (line 1401) | async fn fetch_scopes_for_unmatched_services( function augment_with_dynamic_scopes (line 1431) | async fn augment_with_dynamic_scopes( function run_resolve_scopes (line 1454) | fn run_resolve_scopes(args: &[String], project_id: Option<&str>) -> Vec<... function run_resolve_scopes_with_services (line 1460) | fn run_resolve_scopes_with_services( function resolve_scopes_returns_defaults_when_no_flag (line 1471) | fn resolve_scopes_returns_defaults_when_no_flag() { function resolve_scopes_returns_custom_scopes (line 1479) | fn resolve_scopes_returns_custom_scopes() { function resolve_scopes_handles_multiple_comma_separated (line 1490) | fn resolve_scopes_handles_multiple_comma_separated() { function resolve_scopes_ignores_trailing_flag (line 1503) | fn resolve_scopes_ignores_trailing_flag() { function resolve_scopes_readonly_returns_readonly_scopes (line 1511) | fn resolve_scopes_readonly_returns_readonly_scopes() { function resolve_scopes_custom_overrides_readonly (line 1524) | fn resolve_scopes_custom_overrides_readonly() { function resolve_client_credentials_from_env_vars (line 1538) | fn resolve_client_credentials_from_env_vars() { function resolve_client_credentials_missing_env_vars_uses_config (line 1556) | fn resolve_client_credentials_missing_env_vars_uses_config() { function config_dir_returns_gws_subdir (line 1577) | fn config_dir_returns_gws_subdir() { function config_dir_primary_uses_dot_config (line 1583) | fn config_dir_primary_uses_dot_config() { function config_dir_fallback_to_legacy (line 1593) | fn config_dir_fallback_to_legacy() { function plain_credentials_path_defaults_to_config_dir (line 1612) | fn plain_credentials_path_defaults_to_config_dir() { function plain_credentials_path_respects_env_var (line 1624) | fn plain_credentials_path_respects_env_var() { function token_cache_path_is_in_config_dir (line 1639) | fn token_cache_path_is_in_config_dir() { function handle_auth_command_empty_args_prints_usage (line 1646) | async fn handle_auth_command_empty_args_prints_usage() { function handle_auth_command_help_flag_returns_ok (line 1654) | async fn handle_auth_command_help_flag_returns_ok() { function handle_auth_command_help_short_flag_returns_ok (line 1661) | async fn handle_auth_command_help_short_flag_returns_ok() { function handle_auth_command_invalid_subcommand (line 1668) | async fn handle_auth_command_invalid_subcommand() { function resolve_credentials_fails_without_env_vars_or_config (line 1680) | fn resolve_credentials_fails_without_env_vars_or_config() { function resolve_credentials_uses_env_vars_when_present (line 1700) | fn resolve_credentials_uses_env_vars_when_present() { function handle_status_succeeds_without_credentials (line 1720) | async fn handle_status_succeeds_without_credentials() { function credential_store_save_load_round_trip (line 1728) | fn credential_store_save_load_round_trip() { function extract_refresh_token_from_yup_oauth2_format (line 1737) | fn extract_refresh_token_from_yup_oauth2_format() { function extract_refresh_token_missing_token (line 1747) | fn extract_refresh_token_missing_token() { function extract_refresh_token_empty_array (line 1753) | fn extract_refresh_token_empty_array() { function extract_refresh_token_invalid_json (line 1758) | fn extract_refresh_token_invalid_json() { function extract_refresh_token_object_format (line 1763) | fn extract_refresh_token_object_format() { function is_workspace_admin_scope_apps_alerts (line 1772) | fn is_workspace_admin_scope_apps_alerts() { function is_workspace_admin_scope_apps_groups_settings (line 1779) | fn is_workspace_admin_scope_apps_groups_settings() { function is_workspace_admin_scope_apps_licensing (line 1786) | fn is_workspace_admin_scope_apps_licensing() { function is_workspace_admin_scope_cloud_identity (line 1793) | fn is_workspace_admin_scope_cloud_identity() { function is_workspace_admin_scope_ediscovery (line 1806) | fn is_workspace_admin_scope_ediscovery() { function is_workspace_admin_scope_directory_readonly (line 1813) | fn is_workspace_admin_scope_directory_readonly() { function is_workspace_admin_scope_groups (line 1820) | fn is_workspace_admin_scope_groups() { function is_workspace_admin_scope_normal_scopes_not_admin (line 1827) | fn is_workspace_admin_scope_normal_scopes_not_admin() { function is_workspace_admin_scope_chat_admin (line 1849) | fn is_workspace_admin_scope_chat_admin() { function is_workspace_admin_scope_classroom (line 1865) | fn is_workspace_admin_scope_classroom() { function scope_matches_service_exact_match (line 1877) | fn scope_matches_service_exact_match() { function scope_matches_service_aliases (line 1886) | fn scope_matches_service_aliases() { function scope_matches_service_prefix_match (line 1907) | fn scope_matches_service_prefix_match() { function scope_matches_service_no_match (line 1920) | fn scope_matches_service_no_match() { function scope_matches_service_cloud_platform_always_matches (line 1929) | fn scope_matches_service_cloud_platform_always_matches() { function scope_matches_service_no_partial_name_collision (line 1938) | fn scope_matches_service_no_partial_name_collision() { function scope_matches_service_people_contacts (line 1948) | fn scope_matches_service_people_contacts() { function scope_matches_service_chat (line 1969) | fn scope_matches_service_chat() { function resolve_scopes_with_services_filter (line 1984) | fn resolve_scopes_with_services_filter() { function resolve_scopes_services_filter_unknown_service_ignored (line 2002) | fn resolve_scopes_services_filter_unknown_service_ignored() { function resolve_scopes_services_takes_priority_with_readonly (line 2011) | fn resolve_scopes_services_takes_priority_with_readonly() { function resolve_scopes_services_takes_priority_with_full (line 2027) | fn resolve_scopes_services_takes_priority_with_full() { function resolve_scopes_explicit_scopes_bypass_services_filter (line 2043) | fn resolve_scopes_explicit_scopes_bypass_services_filter() { function filter_scopes_by_services_none_returns_all (line 2055) | fn filter_scopes_by_services_none_returns_all() { function filter_scopes_by_services_empty_set_returns_all (line 2065) | fn filter_scopes_by_services_empty_set_returns_all() { function filter_restrictive_removes_metadata_when_broader_present (line 2076) | fn filter_restrictive_removes_metadata_when_broader_present() { function filter_restrictive_removes_metadata_when_full_gmail_present (line 2088) | fn filter_restrictive_removes_metadata_when_full_gmail_present() { function filter_restrictive_keeps_metadata_when_only_scope (line 2098) | fn filter_restrictive_keeps_metadata_when_only_scope() { function mask_secret_long_string (line 2108) | fn mask_secret_long_string() { function mask_secret_short_string (line 2114) | fn mask_secret_short_string() { function mask_secret_boundary (line 2122) | fn mask_secret_boundary() { function find_unmatched_services_identifies_missing (line 2128) | fn find_unmatched_services_identifies_missing() { function find_unmatched_services_all_matched (line 2140) | fn find_unmatched_services_all_matched() { function make_test_discovery_doc (line 2150) | fn make_test_discovery_doc(scope_urls: &[&str]) -> crate::discovery::Res... function extract_scopes_from_doc_filters_app_only (line 2171) | fn extract_scopes_from_doc_filters_app_only() { function extract_scopes_from_doc_readonly_filter (line 2190) | fn extract_scopes_from_doc_readonly_filter() { function extract_scopes_from_doc_empty_auth (line 2209) | fn extract_scopes_from_doc_empty_auth() { FILE: src/client.rs function build_client (line 3) | pub fn build_client() -> Result { constant MAX_RETRIES (line 22) | const MAX_RETRIES: u32 = 3; constant MAX_RETRY_DELAY_SECS (line 25) | const MAX_RETRY_DELAY_SECS: u64 = 60; function send_with_retry (line 29) | pub async fn send_with_retry( function compute_retry_delay (line 55) | fn compute_retry_delay(header_value: Option<&str>, attempt: u32) -> u64 { function build_client_succeeds (line 67) | fn build_client_succeeds() { function retry_delay_caps_large_header_value (line 72) | fn retry_delay_caps_large_header_value() { function retry_delay_passes_through_small_header_value (line 77) | fn retry_delay_passes_through_small_header_value() { function retry_delay_falls_back_to_exponential_on_missing_header (line 82) | fn retry_delay_falls_back_to_exponential_on_missing_header() { function retry_delay_falls_back_on_unparseable_header (line 89) | fn retry_delay_falls_back_on_unparseable_header() { function retry_delay_caps_at_boundary (line 95) | fn retry_delay_caps_at_boundary() { FILE: src/commands.rs function build_cli (line 20) | pub fn build_cli(doc: &RestDescription) -> Command { function build_resource_command (line 75) | fn build_resource_command(name: &str, resource: &RestResource) -> Option... function make_doc (line 190) | fn make_doc() -> RestDescription { function test_all_commands_always_shown (line 255) | fn test_all_commands_always_shown() { function test_sanitize_arg_present (line 270) | fn test_sanitize_arg_present() { FILE: src/credential_store.rs function ensure_key_dir (line 28) | fn ensure_key_dir(path: &std::path::Path) -> std::io::Result<()> { function save_key_file_exclusive (line 50) | fn save_key_file_exclusive(path: &std::path::Path, b64_key: &str) -> std... function save_key_file (line 71) | fn save_key_file(path: &std::path::Path, b64_key: &str) -> std::io::Resu... function read_key_file (line 74) | fn read_key_file(path: &std::path::Path) -> Option<[u8; 32]> { function generate_random_key (line 109) | fn generate_random_key() -> [u8; 32] { type KeyringProvider (line 116) | trait KeyringProvider { method get_password (line 118) | fn get_password(&self) -> Result; method set_password (line 120) | fn set_password(&self, password: &str) -> Result<(), keyring::Error>; method get_password (line 133) | fn get_password(&self) -> Result { method set_password (line 140) | fn set_password(&self, password: &str) -> Result<(), keyring::Error> { method get_password (line 472) | fn get_password(&self) -> Result { method set_password (line 482) | fn set_password(&self, password: &str) -> Result<(), keyring::Error> { type OsKeyring (line 124) | struct OsKeyring(Option); method new (line 127) | fn new(service: &str, user: &str) -> Self { type KeyringBackend (line 154) | enum KeyringBackend { method from_env (line 160) | fn from_env() -> Self { method as_str (line 178) | fn as_str(&self) -> &'static str { function resolve_key (line 196) | fn resolve_key( function get_or_create_key (line 289) | fn get_or_create_key() -> anyhow::Result<[u8; 32]> { function encrypt (line 321) | pub fn encrypt(plaintext: &[u8]) -> anyhow::Result> { function decrypt (line 338) | pub fn decrypt(data: &[u8]) -> anyhow::Result> { function active_backend_name (line 359) | pub fn active_backend_name() -> &'static str { function encrypted_credentials_path (line 364) | pub fn encrypted_credentials_path() -> PathBuf { function save_encrypted (line 369) | pub fn save_encrypted(json: &str) -> anyhow::Result { function load_encrypted_from_path (line 397) | pub fn load_encrypted_from_path(path: &std::path::Path) -> anyhow::Resul... function load_encrypted (line 404) | pub fn load_encrypted() -> anyhow::Result { type MockState (line 415) | enum MockState { type MockKeyring (line 422) | struct MockKeyring { method with_password (line 430) | fn with_password(b64: &str) -> Self { method no_entry (line 439) | fn no_entry() -> Self { method platform_error (line 448) | fn platform_error() -> Self { method with_set_failure (line 457) | fn with_set_failure(mut self) -> Self { method with_on_set (line 462) | fn with_on_set(self, callback: F) -> Self function write_test_key (line 495) | fn write_test_key(dir: &std::path::Path) -> ([u8; 32], std::path::PathBu... function keyring_backend_returns_keyring_key (line 506) | fn keyring_backend_returns_keyring_key() { function keyring_backend_creates_file_backup_when_missing (line 517) | fn keyring_backend_creates_file_backup_when_missing() { function keyring_backend_syncs_file_when_keyring_differs (line 538) | fn keyring_backend_syncs_file_when_keyring_differs() { function keyring_backend_no_entry_reads_file (line 557) | fn keyring_backend_no_entry_reads_file() { function keyring_backend_no_entry_no_file_generates_and_saves_both (line 571) | fn keyring_backend_no_entry_no_file_generates_and_saves_both() { function keyring_backend_no_entry_no_file_keyring_set_fails (line 584) | fn keyring_backend_no_entry_no_file_keyring_set_fails() { function keyring_backend_platform_error_falls_back_to_file (line 596) | fn keyring_backend_platform_error_falls_back_to_file() { function keyring_backend_platform_error_no_file_generates (line 605) | fn keyring_backend_platform_error_no_file_generates() { function keyring_backend_invalid_keyring_data_uses_file (line 615) | fn keyring_backend_invalid_keyring_data_uses_file() { function file_backend_reads_existing_key (line 627) | fn file_backend_reads_existing_key() { function file_backend_generates_when_missing (line 636) | fn file_backend_generates_when_missing() { function file_backend_skips_keyring_entirely (line 650) | fn file_backend_skips_keyring_entirely() { function key_is_stable_across_calls (line 663) | fn key_is_stable_across_calls() { function backend_default_is_keyring (line 675) | fn backend_default_is_keyring() { function read_key_file_valid (line 683) | fn read_key_file_valid() { function read_key_file_missing (line 693) | fn read_key_file_missing() { function read_key_file_wrong_length (line 699) | fn read_key_file_wrong_length() { function read_key_file_invalid_base64 (line 708) | fn read_key_file_invalid_base64() { function get_or_create_key_is_deterministic (line 718) | fn get_or_create_key_is_deterministic() { function get_or_create_key_produces_256_bits (line 725) | fn get_or_create_key_produces_256_bits() { function encrypt_decrypt_round_trip (line 731) | fn encrypt_decrypt_round_trip() { function encrypt_decrypt_empty (line 741) | fn encrypt_decrypt_empty() { function decrypt_rejects_short_data (line 749) | fn decrypt_rejects_short_data() { function decrypt_rejects_tampered_ciphertext (line 756) | fn decrypt_rejects_tampered_ciphertext() { function each_encryption_produces_different_output (line 767) | fn each_encryption_produces_different_output() { function save_key_file_exclusive_creates_new_file (line 781) | fn save_key_file_exclusive_creates_new_file() { function save_key_file_exclusive_rejects_existing_file (line 789) | fn save_key_file_exclusive_rejects_existing_file() { function save_key_file_overwrites_existing (line 802) | fn save_key_file_overwrites_existing() { function ensure_key_dir_creates_nested_dirs (line 813) | fn ensure_key_dir_creates_nested_dirs() { function backend_from_env_file_lowercase (line 823) | fn backend_from_env_file_lowercase() { function backend_from_env_file_uppercase (line 836) | fn backend_from_env_file_uppercase() { function backend_from_env_invalid_defaults_to_keyring (line 848) | fn backend_from_env_invalid_defaults_to_keyring() { function race_loser_syncs_winner_key_to_keyring (line 861) | fn race_loser_syncs_winner_key_to_keyring() { function race_loser_corrupt_file_overwrites (line 884) | fn race_loser_corrupt_file_overwrites() { FILE: src/discovery.rs type RestDescription (line 29) | pub struct RestDescription { type AuthDescription (line 48) | pub struct AuthDescription { type OAuth2Description (line 53) | pub struct OAuth2Description { type ScopeDescription (line 58) | pub struct ScopeDescription { type RestResource (line 64) | pub struct RestResource { type RestMethod (line 74) | pub struct RestMethod { type MediaUpload (line 97) | pub struct MediaUpload { type MediaUploadProtocols (line 104) | pub struct MediaUploadProtocols { type MediaUploadProtocol (line 110) | pub struct MediaUploadProtocol { type SchemaRef (line 117) | pub struct SchemaRef { type MethodParameter (line 127) | pub struct MethodParameter { type JsonSchema (line 150) | pub struct JsonSchema { type JsonSchemaProperty (line 168) | pub struct JsonSchemaProperty { function fetch_discovery_document (line 187) | pub async fn fetch_discovery_document( function test_deserialize_rest_description (line 261) | fn test_deserialize_rest_description() { function test_deserialize_defaults (line 313) | fn test_deserialize_defaults() { FILE: src/error.rs type GwsError (line 19) | pub enum GwsError { constant EXIT_CODE_API (line 69) | pub const EXIT_CODE_API: i32 = 1; constant EXIT_CODE_AUTH (line 71) | pub const EXIT_CODE_AUTH: i32 = 2; constant EXIT_CODE_VALIDATION (line 73) | pub const EXIT_CODE_VALIDATION: i32 = 3; constant EXIT_CODE_DISCOVERY (line 75) | pub const EXIT_CODE_DISCOVERY: i32 = 4; constant EXIT_CODE_OTHER (line 77) | pub const EXIT_CODE_OTHER: i32 = 5; method exit_code (line 89) | pub fn exit_code(&self) -> i32 { method to_json (line 99) | pub fn to_json(&self) -> serde_json::Value { constant EXIT_CODE_DOCUMENTATION (line 46) | pub const EXIT_CODE_DOCUMENTATION: &[(i32, &str)] = &[ function error_label (line 154) | fn error_label(err: &GwsError) -> String { function print_error_json (line 170) | pub fn print_error_json(err: &GwsError) { function test_exit_code_api (line 212) | fn test_exit_code_api() { function test_exit_code_auth (line 223) | fn test_exit_code_auth() { function test_exit_code_validation (line 231) | fn test_exit_code_validation() { function test_exit_code_discovery (line 239) | fn test_exit_code_discovery() { function test_exit_code_other (line 247) | fn test_exit_code_other() { function test_exit_codes_are_distinct (line 255) | fn test_exit_codes_are_distinct() { function test_error_to_json_api (line 273) | fn test_error_to_json_api() { function test_error_to_json_validation (line 288) | fn test_error_to_json_validation() { function test_error_to_json_auth (line 297) | fn test_error_to_json_auth() { function test_error_to_json_discovery (line 306) | fn test_error_to_json_discovery() { function test_error_to_json_other (line 315) | fn test_error_to_json_other() { function test_error_to_json_access_not_configured_with_url (line 326) | fn test_error_to_json_access_not_configured_with_url() { function test_error_to_json_access_not_configured_without_url (line 343) | fn test_error_to_json_access_not_configured_without_url() { function test_colorize_respects_no_color_env (line 361) | fn test_colorize_respects_no_color_env() { function test_error_label_contains_variant_name (line 371) | fn test_error_label_contains_variant_name() { function test_sanitize_for_terminal_strips_control_chars (line 395) | fn test_sanitize_for_terminal_strips_control_chars() { FILE: src/executor.rs type AuthMethod (line 36) | pub enum AuthMethod { type UploadSource (line 49) | pub enum UploadSource<'a> { type PaginationConfig (line 65) | pub struct PaginationConfig { method default (line 75) | fn default() -> Self { type ExecutionInput (line 86) | struct ExecutionInput { function parse_and_validate_inputs (line 95) | fn parse_and_validate_inputs( function build_http_request (line 161) | async fn build_http_request( function handle_json_response (line 244) | async fn handle_json_response( function handle_binary_response (line 340) | async fn handle_binary_response( function execute_method (line 398) | pub async fn execute_method( function build_url (line 540) | fn build_url( function extract_template_path_parameters (line 662) | fn extract_template_path_parameters(path_template: &str) -> HashSet<&str> { function render_path_template (line 685) | fn render_path_template( function extract_enable_url (line 739) | pub fn extract_enable_url(message: &str) -> Option { function handle_error_response (line 753) | fn handle_error_response( function resolve_upload_mime (line 831) | fn resolve_upload_mime( function build_multipart_stream (line 867) | fn build_multipart_stream( function build_multipart_bytes (line 925) | fn build_multipart_bytes( function build_multipart_body (line 963) | fn build_multipart_body( function validate_body_against_schema (line 995) | fn validate_body_against_schema( function validate_value (line 1013) | fn validate_value( function validate_properties (line 1038) | fn validate_properties( function validate_property (line 1075) | fn validate_property( function get_value_type (line 1142) | fn get_value_type(val: &Value) -> &'static str { function mime_to_extension (line 1155) | pub fn mime_to_extension(mime: &str) -> &str { function test_pagination_config_default (line 1198) | fn test_pagination_config_default() { function test_auth_method_equality (line 1206) | fn test_auth_method_equality() { function test_mime_to_extension_more_types (line 1213) | fn test_mime_to_extension_more_types() { function test_validate_body_valid (line 1231) | fn test_validate_body_valid() { function test_validate_body_unknown_field (line 1260) | fn test_validate_body_unknown_field() { function test_validate_body_deep_validation (line 1292) | fn test_validate_body_deep_validation() { function test_build_multipart_body (line 1412) | async fn test_build_multipart_body() { function test_build_multipart_body_no_metadata (line 1433) | async fn test_build_multipart_body_no_metadata() { function test_resolve_upload_mime_explicit_flag (line 1448) | fn test_resolve_upload_mime_explicit_flag() { function test_resolve_upload_mime_extension_beats_metadata (line 1455) | fn test_resolve_upload_mime_extension_beats_metadata() { function test_resolve_upload_mime_metadata_fallback_for_unknown_extension (line 1465) | fn test_resolve_upload_mime_metadata_fallback_for_unknown_extension() { function test_resolve_upload_mime_extension_when_no_metadata (line 1475) | fn test_resolve_upload_mime_extension_when_no_metadata() { function test_resolve_upload_mime_fallback (line 1487) | fn test_resolve_upload_mime_fallback() { function test_resolve_upload_mime_explicit_enables_import_conversion (line 1493) | fn test_resolve_upload_mime_explicit_enables_import_conversion() { function test_build_multipart_bytes_with_metadata (line 1503) | fn test_build_multipart_bytes_with_metadata() { function test_build_multipart_bytes_without_metadata (line 1521) | fn test_build_multipart_bytes_without_metadata() { function test_build_multipart_stream_content_length (line 1530) | async fn test_build_multipart_stream_content_length() { function test_build_multipart_stream_large_file (line 1567) | async fn test_build_multipart_stream_large_file() { function test_build_url_basic (line 1606) | fn test_build_url_basic() { function test_build_url_substitution (line 1623) | fn test_build_url_substitution() { function test_build_url_query_params (line 1641) | fn test_build_url_query_params() { function test_build_url_repeated_query_param_expands_array (line 1660) | fn test_build_url_repeated_query_param_expands_array() { function test_build_url_encodes_path_parameter_chars (line 1699) | fn test_build_url_encodes_path_parameter_chars() { function test_build_url_plus_expansion_preserves_slashes (line 1737) | fn test_build_url_plus_expansion_preserves_slashes() { function test_build_url_plus_expansion_rejects_reserved_chars (line 1770) | fn test_build_url_plus_expansion_rejects_reserved_chars() { function test_build_url_plus_expansion_rejects_path_traversal (line 1797) | fn test_build_url_plus_expansion_rejects_path_traversal() { function test_build_url_upload_endpoint_substitutes_path_params (line 1824) | fn test_build_url_upload_endpoint_substitutes_path_params() { function test_build_url_does_not_replace_placeholder_like_values (line 1864) | fn test_build_url_does_not_replace_placeholder_like_values() { function test_build_url_errors_for_path_param_not_in_template (line 1886) | fn test_build_url_errors_for_path_param_not_in_template() { function test_build_url_flatpath_fallback_on_mismatch (line 1915) | fn test_build_url_flatpath_fallback_on_mismatch() { function test_handle_error_response_401 (line 1945) | fn test_handle_error_response_401() { function test_handle_error_response_401_with_oauth_does_not_mask_error (line 1959) | fn test_handle_error_response_401_with_oauth_does_not_mask_error() { function test_handle_error_response_api_error (line 1997) | fn test_handle_error_response_api_error() { function test_execute_method_dry_run (line 2030) | async fn test_execute_method_dry_run() { function test_execute_method_missing_path_param (line 2107) | async fn test_execute_method_missing_path_param() { function test_handle_error_response_non_json (line 2154) | fn test_handle_error_response_non_json() { function test_extract_enable_url_typical_message (line 2177) | fn test_extract_enable_url_typical_message() { function test_extract_enable_url_no_url (line 2188) | fn test_extract_enable_url_no_url() { function test_extract_enable_url_non_http (line 2194) | fn test_extract_enable_url_non_http() { function test_extract_enable_url_trims_trailing_punctuation (line 2200) | fn test_extract_enable_url_trims_trailing_punctuation() { function test_handle_error_response_access_not_configured_with_url (line 2210) | fn test_handle_error_response_access_not_configured_with_url() { function test_handle_error_response_access_not_configured_errors_array (line 2248) | fn test_handle_error_response_access_not_configured_errors_array() { function test_get_value_type_helper (line 2279) | fn test_get_value_type_helper() { function test_post_without_body_sets_content_length_zero (line 2290) | async fn test_post_without_body_sets_content_length_zero() { function test_post_with_body_does_not_add_content_length_zero (line 2330) | async fn test_post_with_body_does_not_add_content_length_zero() { function test_get_does_not_set_content_length_zero (line 2368) | async fn test_get_does_not_set_content_length_zero() { FILE: src/formatter.rs type OutputFormat (line 24) | pub enum OutputFormat { method parse (line 42) | pub fn parse(s: &str) -> Result { method from_str (line 55) | pub fn from_str(s: &str) -> Self { function format_value (line 61) | pub fn format_value(value: &Value, format: &OutputFormat) -> String { function format_value_paginated (line 79) | pub fn format_value_paginated(value: &Value, format: &OutputFormat, is_f... function extract_items (line 93) | fn extract_items(value: &Value) -> Option<(&str, &Vec)> { function format_table (line 109) | fn format_table(value: &Value) -> String { function flatten_object (line 117) | fn flatten_object(obj: &serde_json::Map, prefix: &str) ->... function format_table_page (line 142) | fn format_table_page(value: &Value, emit_header: bool) -> String { function format_array_as_table (line 164) | fn format_array_as_table(arr: &[Value], emit_header: bool) -> String { function format_yaml (line 273) | fn format_yaml(value: &Value) -> String { function json_to_yaml (line 277) | fn json_to_yaml(value: &Value, indent: usize) -> String { function format_csv (line 335) | fn format_csv(value: &Value) -> String { function format_csv_page (line 343) | fn format_csv_page(value: &Value, emit_header: bool) -> String { function csv_escape (line 413) | fn csv_escape(s: &str) -> String { function value_to_cell (line 421) | fn value_to_cell(value: &Value) -> String { function test_output_format_from_str (line 441) | fn test_output_format_from_str() { function test_output_format_parse_known (line 451) | fn test_output_format_parse_known() { function test_output_format_parse_unknown_returns_err (line 463) | fn test_output_format_parse_unknown_returns_err() { function test_format_json (line 470) | fn test_format_json() { function test_format_table_array_of_objects (line 478) | fn test_format_table_array_of_objects() { function test_format_table_single_object (line 495) | fn test_format_table_single_object() { function test_format_table_nested_object_flattened (line 503) | fn test_format_table_nested_object_flattened() { function test_format_table_nested_objects_in_array (line 537) | fn test_format_table_nested_objects_in_array() { function test_format_table_multibyte_truncation_does_not_panic (line 552) | fn test_format_table_multibyte_truncation_does_not_panic() { function test_format_table_multibyte_exact_boundary (line 563) | fn test_format_table_multibyte_exact_boundary() { function test_format_csv (line 571) | fn test_format_csv() { function test_format_csv_array_of_arrays (line 585) | fn test_format_csv_array_of_arrays() { function test_format_csv_flat_scalars (line 602) | fn test_format_csv_flat_scalars() { function test_format_csv_flat_scalars_with_escaping (line 614) | fn test_format_csv_flat_scalars_with_escaping() { function test_format_csv_escape (line 626) | fn test_format_csv_escape() { function test_format_yaml (line 633) | fn test_format_yaml() { function test_format_table_empty_array (line 641) | fn test_format_table_empty_array() { function test_extract_items (line 649) | fn test_extract_items() { function test_extract_items_none (line 657) | fn test_extract_items_none() { function test_format_yaml_hash_in_string_is_quoted_not_block (line 665) | fn test_format_yaml_hash_in_string_is_quoted_not_block() { function test_format_yaml_colon_in_string_is_quoted (line 682) | fn test_format_yaml_colon_in_string_is_quoted() { function test_format_yaml_multiline_still_uses_block (line 693) | fn test_format_yaml_multiline_still_uses_block() { function test_format_value_paginated_csv_first_page_has_header (line 706) | fn test_format_value_paginated_csv_first_page_has_header() { function test_format_value_paginated_csv_continuation_no_header (line 720) | fn test_format_value_paginated_csv_continuation_no_header() { function test_format_value_paginated_table_first_page_has_header (line 737) | fn test_format_value_paginated_table_first_page_has_header() { function test_format_value_paginated_table_continuation_no_header (line 752) | fn test_format_value_paginated_table_continuation_no_header() { function test_format_value_paginated_yaml_has_document_separator (line 767) | fn test_format_value_paginated_yaml_has_document_separator() { FILE: src/fs_util.rs function atomic_write (line 30) | pub fn atomic_write(path: &Path, data: &[u8]) -> io::Result<()> { function atomic_write_async (line 48) | pub async fn atomic_write_async(path: &Path, data: &[u8]) -> io::Result<... function test_atomic_write_creates_file (line 115) | fn test_atomic_write_creates_file() { function test_atomic_write_overwrites_existing (line 130) | fn test_atomic_write_overwrites_existing() { function test_atomic_write_leaves_no_tmp_file (line 139) | fn test_atomic_write_leaves_no_tmp_file() { function test_atomic_write_async_creates_file (line 153) | async fn test_atomic_write_async_creates_file() { FILE: src/generate_skills.rs constant PERSONAS_YAML (line 27) | const PERSONAS_YAML: &str = include_str!("../registry/personas.yaml"); constant RECIPES_YAML (line 28) | const RECIPES_YAML: &str = include_str!("../registry/recipes.yaml"); constant BLOCKED_METHODS (line 32) | const BLOCKED_METHODS: &[(&str, &str, &str)] = &[ type PersonaRegistry (line 42) | struct PersonaRegistry { type PersonaEntry (line 47) | struct PersonaEntry { type RecipeRegistry (line 59) | struct RecipeRegistry { type RecipeEntry (line 64) | struct RecipeEntry { type SkillIndexEntry (line 74) | struct SkillIndexEntry { function handle_generate_skills (line 81) | pub async fn handle_generate_skills(args: &[String]) -> Result<(), GwsEr... function parse_output_dir (line 276) | fn parse_output_dir(args: &[String]) -> String { function parse_filter (line 288) | fn parse_filter(args: &[String]) -> Option { function write_skill (line 299) | fn write_skill(base: &Path, name: &str, content: &str) -> Result<(), Gws... function write_skills_index (line 310) | fn write_skills_index(entries: &[SkillIndexEntry]) -> Result<(), GwsErro... function is_blocked_method (line 366) | fn is_blocked_method(alias: &str, resource: &str, method: &str) -> bool { function render_service_skill (line 372) | fn render_service_skill( function render_helper_skill (line 486) | fn render_helper_skill( function generate_shared_skill (line 668) | fn generate_shared_skill(base: &Path) -> Result<(), GwsError> { function render_persona_skill (line 755) | fn render_persona_skill(persona: &PersonaEntry) -> String { function render_recipe_skill (line 826) | fn render_recipe_skill(recipe: &RecipeEntry) -> String { function truncate_desc (line 885) | fn truncate_desc(desc: &str) -> String { function lookup_method_description (line 902) | fn lookup_method_description( function capitalize_first (line 923) | fn capitalize_first(s: &str) -> String { function product_name_from_title (line 931) | fn product_name_from_title(title: &str) -> String { function service_description (line 952) | fn service_description(product_name: &str, discovery_desc: &str) -> Stri... function test_registry_references (line 973) | fn test_registry_references() { function test_truncate_desc_short (line 1035) | fn test_truncate_desc_short() { function test_truncate_desc_capitalizes (line 1040) | fn test_truncate_desc_capitalizes() { function test_truncate_desc_replaces_quotes (line 1045) | fn test_truncate_desc_replaces_quotes() { function test_truncate_desc_truncates_long (line 1053) | fn test_truncate_desc_truncates_long() { function test_truncate_desc_adds_period (line 1063) | fn test_truncate_desc_adds_period() { function test_truncate_desc_preserves_existing_period (line 1068) | fn test_truncate_desc_preserves_existing_period() { function test_truncate_desc_ellipsis_no_period (line 1073) | fn test_truncate_desc_ellipsis_no_period() { function test_lookup_method_description_found (line 1082) | fn test_lookup_method_description_found() { function test_lookup_method_description_missing_resource (line 1114) | fn test_lookup_method_description_missing_resource() { function test_lookup_method_description_missing_method (line 1123) | fn test_lookup_method_description_missing_method() { function test_lookup_method_description_no_description (line 1138) | fn test_lookup_method_description_no_description() { function test_capitalize_first_empty (line 1166) | fn test_capitalize_first_empty() { function test_capitalize_first_basic (line 1171) | fn test_capitalize_first_basic() { function test_product_name_from_title_strips_api (line 1176) | fn test_product_name_from_title_strips_api() { function test_product_name_from_title_no_api_suffix (line 1181) | fn test_product_name_from_title_no_api_suffix() { function test_product_name_from_title_adds_google (line 1187) | fn test_product_name_from_title_adds_google() { FILE: src/helpers/calendar.rs type CalendarHelper (line 25) | pub struct CalendarHelper; method inject_commands (line 28) | fn inject_commands( method handle (line 157) | fn handle<'a>( function handle_agenda (line 209) | async fn handle_agenda(matches: &ArgMatches) -> Result<(), GwsError> { function build_insert_request (line 422) | fn build_insert_request( function make_mock_doc (line 526) | fn make_mock_doc() -> crate::discovery::RestDescription { function make_matches_insert (line 538) | fn make_matches_insert(args: &[&str]) -> ArgMatches { function test_build_insert_request (line 560) | fn test_build_insert_request() { function test_build_insert_request_with_meet (line 580) | fn test_build_insert_request_with_meet() { function test_build_insert_request_with_meet_is_idempotent (line 604) | fn test_build_insert_request_with_meet_is_idempotent() { function test_build_insert_request_with_meet_idempotency_robust (line 633) | fn test_build_insert_request_with_meet_idempotency_robust() { function test_build_insert_request_with_optional_fields (line 714) | fn test_build_insert_request_with_optional_fields() { function agenda_day_boundaries_use_account_timezone (line 743) | fn agenda_day_boundaries_use_account_timezone() { FILE: src/helpers/chat.rs type ChatHelper (line 24) | pub struct ChatHelper; method inject_commands (line 27) | fn inject_commands( method handle (line 62) | fn handle<'a>( function build_send_request (line 129) | fn build_send_request( type SendConfig (line 163) | pub struct SendConfig { function parse_send_args (line 179) | pub fn parse_send_args(matches: &ArgMatches) -> Result RestDescription { function make_matches_send (line 222) | fn make_matches_send(args: &[&str]) -> ArgMatches { function test_build_send_request (line 230) | fn test_build_send_request() { function test_parse_send_args (line 244) | fn test_parse_send_args() { function test_parse_send_args_rejects_traversal_in_space (line 252) | fn test_parse_send_args_rejects_traversal_in_space() { function test_parse_send_args_rejects_query_injection_in_space (line 262) | fn test_parse_send_args_rejects_query_injection_in_space() { function test_inject_commands (line 273) | fn test_inject_commands() { FILE: src/helpers/docs.rs type DocsHelper (line 24) | pub struct DocsHelper; method inject_commands (line 27) | fn inject_commands( method handle (line 62) | fn handle<'a>( function build_write_request (line 119) | fn build_write_request( function make_mock_doc (line 166) | fn make_mock_doc() -> RestDescription { function make_matches_write (line 188) | fn make_matches_write(args: &[&str]) -> ArgMatches { function test_build_write_request (line 196) | fn test_build_write_request() { FILE: src/helpers/drive.rs type DriveHelper (line 25) | pub struct DriveHelper; method inject_commands (line 28) | fn inject_commands( method handle (line 69) | fn handle<'a>( function determine_filename (line 133) | fn determine_filename(file_path: &str, name_arg: Option<&str>) -> Result... function build_metadata (line 145) | fn build_metadata(filename: &str, parent_id: Option<&str>) -> Value { function test_determine_filename_explicit (line 162) | fn test_determine_filename_explicit() { function test_determine_filename_from_path (line 170) | fn test_determine_filename_from_path() { function test_determine_filename_invalid_path (line 178) | fn test_determine_filename_invalid_path() { function test_build_metadata_no_parent (line 184) | fn test_build_metadata_no_parent() { function test_build_metadata_with_parent (line 191) | fn test_build_metadata_with_parent() { FILE: src/helpers/events/mod.rs type EventsHelper (line 31) | pub struct EventsHelper; constant PUBSUB_SCOPE (line 32) | pub(super) const PUBSUB_SCOPE: &str = "https://www.googleapis.com/auth/p... constant WORKSPACE_EVENTS_SCOPE (line 33) | pub(super) const WORKSPACE_EVENTS_SCOPE: &str = type ProjectId (line 37) | pub struct ProjectId(pub String); method fmt (line 39) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { type SubscriptionName (line 45) | pub struct SubscriptionName(pub String); method fmt (line 47) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { method inject_commands (line 53) | fn inject_commands( method handle (line 173) | fn handle<'a>( function test_inject_commands (line 200) | fn test_inject_commands() { FILE: src/helpers/events/renew.rs type RenewConfig (line 4) | pub struct RenewConfig { function parse_renew_args (line 10) | fn parse_renew_args(matches: &ArgMatches) -> Result Result { function parse_rfc3339_rough (line 151) | fn parse_rfc3339_rough(s: &str) -> Option { function make_matches_renew (line 161) | fn make_matches_renew(args: &[&str]) -> ArgMatches { function test_parse_duration_hours (line 170) | fn test_parse_duration_hours() { function test_parse_duration_minutes (line 176) | fn test_parse_duration_minutes() { function test_parse_duration_days (line 181) | fn test_parse_duration_days() { function test_parse_duration_invalid (line 187) | fn test_parse_duration_invalid() { function test_parse_rfc3339_rough (line 193) | fn test_parse_rfc3339_rough() { function test_parse_renew_args_name (line 205) | fn test_parse_renew_args_name() { function test_parse_renew_args_all (line 213) | fn test_parse_renew_args_all() { function test_parse_renew_args_missing (line 222) | fn test_parse_renew_args_missing() { function test_filter_subscriptions_to_renew (line 228) | fn test_filter_subscriptions_to_renew() { FILE: src/helpers/events/subscribe.rs type SubscribeConfig (line 9) | pub struct SubscribeConfig { function parse_subscribe_args (line 32) | fn parse_subscribe_args(matches: &ArgMatches) -> Result Result<(), Gws... function handle_subscribe (line 105) | pub(super) async fn handle_subscribe( function pull_loop (line 315) | async fn pull_loop( function process_events_pull_response (line 427) | fn process_events_pull_response(response: &Value) -> (Vec, Vec Value { function derive_slug_from_event_types (line 488) | fn derive_slug_from_event_types(event_types: &[&str]) -> String { function spawn_subscribe_server (line 554) | async fn spawn_subscribe_server() -> ( function make_matches_subscribe (line 618) | fn make_matches_subscribe(args: &[&str]) -> ArgMatches { function test_parse_subscribe_args_invalid_output_dir (line 638) | fn test_parse_subscribe_args_invalid_output_dir() { function test_parse_subscribe_args (line 647) | fn test_parse_subscribe_args() { function test_parse_subscribe_args_subscription (line 671) | fn test_parse_subscribe_args_subscription() { function test_slug_single_event_type (line 684) | fn test_slug_single_event_type() { function test_slug_single_event_type_chat (line 690) | fn test_slug_single_event_type_chat() { function test_slug_multiple_event_types_common_prefix (line 696) | fn test_slug_multiple_event_types_common_prefix() { function test_slug_non_workspace_prefix (line 706) | fn test_slug_non_workspace_prefix() { function test_slug_truncation (line 713) | fn test_slug_truncation() { function test_decode_cloud_event (line 721) | fn test_decode_cloud_event() { function test_process_events_pull_response (line 744) | fn test_process_events_pull_response() { function test_process_events_pull_response_empty (line 799) | fn test_process_events_pull_response_empty() { function test_handle_subscribe_validation_missing_target (line 807) | fn test_handle_subscribe_validation_missing_target() { function test_handle_subscribe_validation_missing_events (line 820) | fn test_handle_subscribe_validation_missing_events() { function test_handle_subscribe_validation_missing_project (line 833) | fn test_handle_subscribe_validation_missing_project() { function test_pull_loop_refreshes_pubsub_token_between_requests (line 846) | async fn test_pull_loop_refreshes_pubsub_token_between_requests() { FILE: src/helpers/gmail/forward.rs function handle_forward (line 18) | pub(super) async fn handle_forward( type ForwardConfig (line 71) | pub(super) struct ForwardConfig { type ForwardEnvelope (line 82) | struct ForwardEnvelope<'a> { function build_forward_subject (line 95) | fn build_forward_subject(original_subject: &str) -> String { function create_forward_raw_message (line 103) | fn create_forward_raw_message( function join_mailboxes (line 129) | fn join_mailboxes(mailboxes: &[Mailbox]) -> String { function format_forwarded_message (line 137) | fn format_forwarded_message(original: &OriginalMessage) -> String { function format_forwarded_message_html (line 162) | fn format_forwarded_message_html(original: &OriginalMessage) -> String { function parse_forward_args (line 200) | fn parse_forward_args(matches: &ArgMatches) -> Result ArgMatches { function test_parse_forward_args (line 468) | fn test_parse_forward_args() { function test_parse_forward_args_with_all_options (line 480) | fn test_parse_forward_args_with_all_options() { function test_parse_forward_args_html_flag (line 520) | fn test_parse_forward_args_html_flag() { function test_parse_forward_args_empty_to_returns_error (line 540) | fn test_parse_forward_args_empty_to_returns_error() { function test_format_forwarded_message_html_with_html_body (line 552) | fn test_format_forwarded_message_html_with_html_body() { function test_format_forwarded_message_html_fallback_plain_text (line 572) | fn test_format_forwarded_message_html_fallback_plain_text() { function test_format_forwarded_message_html_escapes_metadata (line 587) | fn test_format_forwarded_message_html_escapes_metadata() { function test_format_forwarded_message_html_conditional_cc (line 608) | fn test_format_forwarded_message_html_conditional_cc() { function test_create_forward_raw_message_html_without_body (line 630) | fn test_create_forward_raw_message_html_without_body() { function test_create_forward_raw_message_html_plain_text_fallback (line 671) | fn test_create_forward_raw_message_html_plain_text_fallback() { function test_create_forward_raw_message_html (line 707) | fn test_create_forward_raw_message_html() { function test_create_forward_raw_message_with_attachment (line 746) | fn test_create_forward_raw_message_with_attachment() { FILE: src/helpers/gmail/mod.rs type GmailHelper (line 43) | pub struct GmailHelper; constant GMAIL_SCOPE (line 45) | pub(super) const GMAIL_SCOPE: &str = "https://www.googleapis.com/auth/gm... constant GMAIL_READONLY_SCOPE (line 46) | pub(super) const GMAIL_READONLY_SCOPE: &str = "https://www.googleapis.co... constant PUBSUB_SCOPE (line 47) | pub(super) const PUBSUB_SCOPE: &str = "https://www.googleapis.com/auth/p... function sanitize_control_chars (line 56) | fn sanitize_control_chars(s: &str) -> String { type Mailbox (line 62) | pub(super) struct Mailbox { method parse (line 75) | pub fn parse(raw: &str) -> Self { method parse_list (line 102) | pub fn parse_list(raw: &str) -> Vec { method email_lowercase (line 111) | pub fn email_lowercase(&self) -> String { method fmt (line 119) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function to_mb_address (line 128) | pub(super) fn to_mb_address(mailbox: &Mailbox) -> MbAddress<'_> { function to_mb_address_list (line 133) | pub(super) fn to_mb_address_list(mailboxes: &[Mailbox]) -> MbAddress<'_> { function strip_angle_brackets (line 138) | pub(super) fn strip_angle_brackets(id: &str) -> &str { type OriginalMessage (line 153) | pub(super) struct OriginalMessage { method dry_run_placeholder (line 172) | pub(super) fn dry_run_placeholder(message_id: &str) -> Self { type ParsedMessageHeaders (line 190) | struct ParsedMessageHeaders { function append_header_value (line 201) | fn append_header_value(existing: &mut String, value: &str) { function append_address_list_header_value (line 208) | fn append_address_list_header_value(existing: &mut String, value: &str) { function parse_message_headers (line 219) | fn parse_message_headers(headers: &[Value]) -> ParsedMessageHeaders { function non_empty_then (line 243) | fn non_empty_then(s: &str, f: impl FnOnce(&str) -> T) -> Option { function non_empty_slice (line 252) | pub(super) fn non_empty_slice(s: &[T]) -> Option<&[T]> { function parse_original_message (line 260) | fn parse_original_message(msg: &Value) -> Result... type SendAsIdentity (line 405) | struct SendAsIdentity { function fetch_send_as_identities (line 411) | async fn fetch_send_as_identities( function parse_send_as_response (line 445) | fn parse_send_as_response(body: &Value) -> Vec { function resolve_sender_from_identities (line 484) | fn resolve_sender_from_identities( function resolve_sender (line 526) | pub(super) async fn resolve_sender( function fetch_profile_display_name (line 604) | async fn fetch_profile_display_name( function parse_profile_display_name (line 634) | fn parse_profile_display_name(body: &Value) -> Option { function extract_body_by_mime (line 644) | fn extract_body_by_mime(payload: &Value, target_mime: &str) -> Option Option { function extract_html_body (line 692) | fn extract_html_body(payload: &Value) -> Option { function resolve_html_body (line 699) | pub(super) fn resolve_html_body(original: &OriginalMessage) -> String { function html_escape (line 710) | pub(super) fn html_escape(text: &str) -> String { function split_raw_mailbox_list (line 721) | fn split_raw_mailbox_list(header: &str) -> Vec<&str> { function format_email_link (line 758) | pub(super) fn format_email_link(email: &str) -> String { function format_sender_for_attribution (line 768) | pub(super) fn format_sender_for_attribution(mailbox: &Mailbox) -> String { function format_address_list_with_links (line 781) | pub(super) fn format_address_list_with_links(mailboxes: &[Mailbox]) -> S... function format_date_for_attribution (line 793) | pub(super) fn format_date_for_attribution(raw_date: &str) -> String { function format_forward_from (line 808) | pub(super) fn format_forward_from(mailbox: &Mailbox) -> String { type ThreadingHeaders (line 828) | pub(super) struct ThreadingHeaders<'a> { function build_references_chain (line 834) | pub(super) fn build_references_chain(original: &OriginalMessage) -> Vec<... function set_threading_headers (line 844) | pub(super) fn set_threading_headers<'x>( function apply_optional_headers (line 872) | pub(super) fn apply_optional_headers<'x>( function finalize_message (line 891) | pub(super) fn finalize_message( function parse_optional_trimmed (line 911) | pub(super) fn parse_optional_trimmed(matches: &ArgMatches, name: &str) -... function parse_optional_mailboxes (line 920) | pub(super) fn parse_optional_mailboxes(matches: &ArgMatches, name: &str)... constant MAX_TOTAL_ATTACHMENT_BYTES (line 930) | const MAX_TOTAL_ATTACHMENT_BYTES: u64 = 25 * 1024 * 1024; type Attachment (line 939) | pub(super) struct Attachment { function parse_attachments (line 956) | pub(super) fn parse_attachments(matches: &ArgMatches) -> Result) -> Option { function send_raw_email (line 1037) | pub(super) async fn send_raw_email( function common_mail_args (line 1096) | fn common_mail_args(cmd: Command) -> Command { function common_reply_args (line 1132) | fn common_reply_args(cmd: Command) -> Command { method inject_commands (line 1166) | fn inject_commands( method handle (line 1503) | fn handle<'a>( function extract_header (line 1559) | pub(super) fn extract_header(raw: &str, name: &str) -> Option { function strip_qp_soft_breaks (line 1584) | pub(super) fn strip_qp_soft_breaks(raw: &str) -> String { function test_to_mb_address_bare_email (line 1591) | fn test_to_mb_address_bare_email() { function test_to_mb_address_with_display_name (line 1604) | fn test_to_mb_address_with_display_name() { function test_to_mb_address_list_multiple (line 1618) | fn test_to_mb_address_list_multiple() { function test_set_threading_headers_output (line 1633) | fn test_set_threading_headers_output() { function test_original_message_default (line 1661) | fn test_original_message_default() { function test_parse_original_message_minimal (line 1678) | fn test_parse_original_message_minimal() { function test_parse_original_message_bare_message_id (line 1709) | fn test_parse_original_message_bare_message_id() { function test_parse_original_message_missing_payload (line 1729) | fn test_parse_original_message_missing_payload() { function test_parse_original_message_missing_thread_id (line 1740) | fn test_parse_original_message_missing_thread_id() { function test_parse_original_message_missing_from (line 1757) | fn test_parse_original_message_missing_from() { function test_parse_original_message_missing_message_id (line 1775) | fn test_parse_original_message_missing_message_id() { function test_parse_original_message_snippet_fallback (line 1793) | fn test_parse_original_message_snippet_fallback() { function test_extract_plain_text_body_simple (line 1815) | fn test_extract_plain_text_body_simple() { function test_extract_plain_text_body_multipart (line 1826) | fn test_extract_plain_text_body_multipart() { function test_extract_plain_text_body_nested_multipart (line 1847) | fn test_extract_plain_text_body_nested_multipart() { function test_extract_plain_text_body_no_text_part (line 1877) | fn test_extract_plain_text_body_no_text_part() { function test_inject_commands (line 1886) | fn test_inject_commands() { function test_build_send_metadata_with_thread_id (line 1902) | fn test_build_send_metadata_with_thread_id() { function test_build_send_metadata_without_thread_id (line 1909) | fn test_build_send_metadata_without_thread_id() { function test_append_address_list_header_value (line 1914) | fn test_append_address_list_header_value() { function test_parse_original_message_concatenates_repeated_address_and_reference_headers (line 1925) | fn test_parse_original_message_concatenates_repeated_address_and_referen... function test_parse_original_message_multipart_alternative (line 1981) | fn test_parse_original_message_multipart_alternative() { function test_resolve_send_method_finds_gmail_send_method (line 2014) | fn test_resolve_send_method_finds_gmail_send_method() { function test_html_escape (line 2037) | fn test_html_escape() { function test_extract_html_body_direct (line 2056) | fn test_extract_html_body_direct() { function test_extract_html_body_from_multipart (line 2067) | fn test_extract_html_body_from_multipart() { function test_extract_html_body_missing (line 2088) | fn test_extract_html_body_missing() { function test_extract_html_body_from_nested_multipart (line 2097) | fn test_extract_html_body_from_nested_multipart() { function test_resolve_html_body_uses_html_when_present (line 2127) | fn test_resolve_html_body_uses_html_when_present() { function test_resolve_html_body_escapes_plain_text_fallback (line 2137) | fn test_resolve_html_body_escapes_plain_text_fallback() { function test_mailbox_parse_bare_email (line 2153) | fn test_mailbox_parse_bare_email() { function test_mailbox_parse_with_display_name (line 2160) | fn test_mailbox_parse_with_display_name() { function test_mailbox_parse_quoted_display_name (line 2167) | fn test_mailbox_parse_quoted_display_name() { function test_mailbox_parse_malformed_no_closing_bracket (line 2174) | fn test_mailbox_parse_malformed_no_closing_bracket() { function test_mailbox_parse_empty (line 2181) | fn test_mailbox_parse_empty() { function test_mailbox_parse_empty_angle_brackets (line 2188) | fn test_mailbox_parse_empty_angle_brackets() { function test_mailbox_parse_strips_crlf_injection_in_email (line 2196) | fn test_mailbox_parse_strips_crlf_injection_in_email() { function test_mailbox_parse_strips_crlf_injection_in_angle_bracket_email (line 2204) | fn test_mailbox_parse_strips_crlf_injection_in_angle_bracket_email() { function test_mailbox_parse_strips_control_chars_from_name (line 2212) | fn test_mailbox_parse_strips_control_chars_from_name() { function test_mailbox_parse_strips_null_bytes_from_email (line 2219) | fn test_mailbox_parse_strips_null_bytes_from_email() { function test_mailbox_parse_strips_tab_from_email (line 2225) | fn test_mailbox_parse_strips_tab_from_email() { function test_mailbox_parse_non_ascii_display_name (line 2231) | fn test_mailbox_parse_non_ascii_display_name() { function test_mailbox_parse_list (line 2249) | fn test_mailbox_parse_list() { function test_mailbox_parse_list_with_quoted_comma (line 2258) | fn test_mailbox_parse_list_with_quoted_comma() { function test_mailbox_parse_list_filters_empty_emails (line 2267) | fn test_mailbox_parse_list_filters_empty_emails() { function test_mailbox_display (line 2291) | fn test_mailbox_display() { function test_strip_angle_brackets (line 2306) | fn test_strip_angle_brackets() { function test_build_references_chain (line 2316) | fn test_build_references_chain() { function test_format_sender_for_attribution (line 2354) | fn test_format_sender_for_attribution() { function test_format_email_link_prevents_mailto_injection (line 2376) | fn test_format_email_link_prevents_mailto_injection() { function test_format_address_list_with_links (line 2388) | fn test_format_address_list_with_links() { function test_format_date_for_attribution (line 2413) | fn test_format_date_for_attribution() { function test_format_forward_from (line 2425) | fn test_format_forward_from() { function test_split_raw_mailbox_list (line 2441) | fn test_split_raw_mailbox_list() { function test_parse_optional_trimmed (line 2469) | fn test_parse_optional_trimmed() { function make_attach_matches (line 2503) | fn make_attach_matches(args: &[&str]) -> ArgMatches { function test_attachment_single_file (line 2514) | fn test_attachment_single_file() { function test_attachment_multiple_files (line 2532) | fn test_attachment_multiple_files() { function test_attachment_with_html_body (line 2556) | fn test_attachment_with_html_body() { function test_attachment_empty_produces_no_multipart (line 2575) | fn test_attachment_empty_produces_no_multipart() { function test_parse_attachments_rejects_control_chars (line 2586) | fn test_parse_attachments_rejects_control_chars() { function test_parse_attachments_rejects_directory (line 2593) | fn test_parse_attachments_rejects_directory() { function test_parse_attachments_empty_returns_empty_vec (line 2601) | fn test_parse_attachments_empty_returns_empty_vec() { function test_parse_attachments_reads_real_file (line 2608) | fn test_parse_attachments_reads_real_file() { function test_parse_attachments_nonexistent_file (line 2627) | fn test_parse_attachments_nonexistent_file() { function test_parse_attachments_unknown_extension_falls_back_to_octet_stream (line 2638) | fn test_parse_attachments_unknown_extension_falls_back_to_octet_stream() { function test_parse_attachments_size_limit_accumulates (line 2654) | fn test_parse_attachments_size_limit_accumulates() { function test_parse_attachments_rejects_empty_file (line 2682) | fn test_parse_attachments_rejects_empty_file() { function test_parse_send_as_response (line 2700) | fn test_parse_send_as_response() { function test_parse_send_as_response_empty (line 2751) | fn test_parse_send_as_response_empty() { function test_parse_send_as_response_skips_missing_email (line 2758) | fn test_parse_send_as_response_skips_missing_email() { function make_identities (line 2770) | fn make_identities() -> Vec { function test_resolve_sender_no_from_returns_default (line 2790) | fn test_resolve_sender_no_from_returns_default() { function test_resolve_sender_bare_email_enriched (line 2800) | fn test_resolve_sender_bare_email_enriched() { function test_resolve_sender_bare_email_case_insensitive (line 2810) | fn test_resolve_sender_bare_email_case_insensitive() { function test_resolve_sender_bare_email_not_in_list_passes_through (line 2819) | fn test_resolve_sender_bare_email_not_in_list_passes_through() { function test_resolve_sender_with_display_name_returns_as_is (line 2829) | fn test_resolve_sender_with_display_name_returns_as_is() { function test_resolve_sender_mixed_enriches_only_bare (line 2839) | fn test_resolve_sender_mixed_enriches_only_bare() { function test_resolve_sender_no_default_in_list (line 2854) | fn test_resolve_sender_no_default_in_list() { function test_resolve_sender_empty_display_name_treated_as_none (line 2867) | fn test_resolve_sender_empty_display_name_treated_as_none() { function test_parse_profile_display_name (line 2884) | fn test_parse_profile_display_name() { function test_parse_profile_display_name_empty (line 2906) | fn test_parse_profile_display_name_empty() { function test_parse_profile_display_name_empty_name (line 2912) | fn test_parse_profile_display_name_empty_name() { function test_parse_profile_display_name_no_names_array (line 2920) | fn test_parse_profile_display_name_no_names_array() { function test_build_api_error_parses_google_json_format (line 2928) | fn test_build_api_error_parses_google_json_format() { function test_build_api_error_falls_back_to_raw_body (line 2949) | fn test_build_api_error_falls_back_to_raw_body() { function test_build_api_error_extracts_top_level_reason (line 2967) | fn test_build_api_error_extracts_top_level_reason() { function test_build_api_error_access_not_configured_extracts_url (line 2977) | fn test_build_api_error_access_not_configured_extracts_url() { FILE: src/helpers/gmail/read.rs function handle_read (line 19) | pub(super) async fn handle_read( function format_mailbox_list (line 96) | fn format_mailbox_list(mailboxes: &[Mailbox]) -> String { function test_sanitize_for_terminal (line 111) | fn test_sanitize_for_terminal() { function test_format_mailbox_list_empty (line 126) | fn test_format_mailbox_list_empty() { function test_format_mailbox_list_single (line 131) | fn test_format_mailbox_list_single() { function test_format_mailbox_list_multiple (line 138) | fn test_format_mailbox_list_multiple() { FILE: src/helpers/gmail/reply.rs function handle_reply (line 18) | pub(super) async fn handle_reply( type ReplyRecipients (line 123) | struct ReplyRecipients { type ReplyEnvelope (line 128) | struct ReplyEnvelope<'a> { type ReplyConfig (line 139) | pub(super) struct ReplyConfig { function fetch_user_email (line 154) | async fn fetch_user_email(client: &reqwest::Client, token: &str) -> Resu... function extract_reply_to_address (line 190) | fn extract_reply_to_address(original: &OriginalMessage) -> Vec { function build_reply_all_recipients (line 197) | fn build_reply_all_recipients( function dedup_recipients (line 268) | fn dedup_recipients( function collect_excluded_emails (line 294) | fn collect_excluded_emails( function build_reply_subject (line 321) | fn build_reply_subject(original_subject: &str) -> String { function create_reply_raw_message (line 329) | fn create_reply_raw_message( function format_quoted_original (line 351) | fn format_quoted_original(original: &OriginalMessage) -> String { function format_quoted_original_html (line 366) | fn format_quoted_original_html(original: &OriginalMessage) -> String { function parse_reply_args (line 396) | fn parse_reply_args(matches: &ArgMatches) -> Result ArgMatches { function test_parse_reply_args (line 668) | fn test_parse_reply_args() { function test_parse_reply_args_with_all_options (line 680) | fn test_parse_reply_args_with_all_options() { function test_parse_reply_args_html_flag (line 729) | fn test_parse_reply_args_html_flag() { function test_parse_reply_args_without_remove_defined (line 749) | fn test_parse_reply_args_without_remove_defined() { function test_extract_reply_to_address_falls_back_to_from (line 773) | fn test_extract_reply_to_address_falls_back_to_from() { function test_extract_reply_to_address_prefers_reply_to (line 785) | fn test_extract_reply_to_address_prefers_reply_to() { function test_remove_does_not_match_substring (line 797) | fn test_remove_does_not_match_substring() { function test_reply_all_uses_reply_to_for_to (line 816) | fn test_reply_all_uses_reply_to_for_to() { function test_sender_with_display_name_excluded_from_cc (line 832) | fn test_sender_with_display_name_excluded_from_cc() { function test_remove_with_display_name_format (line 849) | fn test_remove_with_display_name_format() { function test_reply_all_with_extra_cc (line 867) | fn test_reply_all_with_extra_cc() { function test_reply_all_cc_none_when_all_filtered (line 882) | fn test_reply_all_cc_none_when_all_filtered() { function test_case_insensitive_sender_exclusion (line 893) | fn test_case_insensitive_sender_exclusion() { function test_reply_all_multi_address_reply_to_deduplicates_cc (line 909) | fn test_reply_all_multi_address_reply_to_deduplicates_cc() { function test_reply_all_with_quoted_comma_display_name (line 938) | fn test_reply_all_with_quoted_comma_display_name() { function test_remove_with_quoted_comma_display_name (line 951) | fn test_remove_with_quoted_comma_display_name() { function test_reply_all_excludes_self_email (line 965) | fn test_reply_all_excludes_self_email() { function test_reply_all_excludes_self_case_insensitive (line 983) | fn test_reply_all_excludes_self_case_insensitive() { function test_reply_all_deduplicates_cc (line 1001) | fn test_reply_all_deduplicates_cc() { function test_reply_all_to_own_message_puts_original_to_in_to (line 1023) | fn test_reply_all_to_own_message_puts_original_to_in_to() { function test_reply_all_to_own_message_detected_via_alias (line 1047) | fn test_reply_all_to_own_message_detected_via_alias() { function test_reply_all_to_own_message_excludes_self_from_original_to (line 1067) | fn test_reply_all_to_own_message_excludes_self_from_original_to() { function test_reply_all_to_own_message_ignores_reply_to (line 1086) | fn test_reply_all_to_own_message_ignores_reply_to() { function test_dedup_no_overlap (line 1107) | fn test_dedup_no_overlap() { function test_dedup_to_wins_over_cc (line 1118) | fn test_dedup_to_wins_over_cc() { function test_dedup_to_wins_over_bcc (line 1131) | fn test_dedup_to_wins_over_bcc() { function test_dedup_cc_wins_over_bcc (line 1144) | fn test_dedup_cc_wins_over_bcc() { function test_dedup_all_three_overlap (line 1158) | fn test_dedup_all_three_overlap() { function test_dedup_case_insensitive (line 1176) | fn test_dedup_case_insensitive() { function test_dedup_bcc_fully_overlaps_returns_empty (line 1189) | fn test_dedup_bcc_fully_overlaps_returns_empty() { function test_dedup_with_display_names (line 1201) | fn test_dedup_with_display_names() { function test_dedup_intro_pattern (line 1215) | fn test_dedup_intro_pattern() { function test_dedup_simple_reply_no_cc_bcc (line 1226) | fn test_dedup_simple_reply_no_cc_bcc() { function test_format_quoted_original (line 1238) | fn test_format_quoted_original() { function test_format_quoted_original_empty_body (line 1253) | fn test_format_quoted_original_empty_body() { function test_format_quoted_original_missing_date (line 1266) | fn test_format_quoted_original_missing_date() { function test_extra_to_appears_in_raw_message (line 1282) | fn test_extra_to_appears_in_raw_message() { function test_intro_pattern_raw_message (line 1321) | fn test_intro_pattern_raw_message() { function test_format_quoted_original_html_with_html_body (line 1382) | fn test_format_quoted_original_html_with_html_body() { function test_format_quoted_original_html_fallback_plain_text (line 1401) | fn test_format_quoted_original_html_fallback_plain_text() { function test_format_quoted_original_html_escapes_metadata (line 1416) | fn test_format_quoted_original_html_escapes_metadata() { function test_create_reply_raw_message_html (line 1430) | fn test_create_reply_raw_message_html() { function test_create_reply_raw_message_with_attachment (line 1471) | fn test_create_reply_raw_message_with_attachment() { FILE: src/helpers/gmail/send.rs function handle_send (line 18) | pub(super) async fn handle_send( type SendConfig (line 47) | pub(super) struct SendConfig { function create_send_raw_message (line 58) | fn create_send_raw_message(config: &SendConfig) -> Result Result { function make_matches_send (line 97) | fn make_matches_send(args: &[&str]) -> ArgMatches { function test_parse_send_args (line 116) | fn test_parse_send_args() { function test_parse_send_args_with_from (line 137) | fn test_parse_send_args_with_from() { function test_parse_send_args_with_cc_and_bcc (line 169) | fn test_parse_send_args_with_cc_and_bcc() { function test_parse_send_args_html_flag (line 207) | fn test_parse_send_args_html_flag() { function test_parse_send_args_empty_to_returns_error (line 236) | fn test_parse_send_args_empty_to_returns_error() { function test_send_html_raw_message (line 246) | fn test_send_html_raw_message() { function test_send_plain_text_raw_message (line 272) | fn test_send_plain_text_raw_message() { function test_send_with_cc_and_bcc (line 294) | fn test_send_with_cc_and_bcc() { function test_send_with_from (line 326) | fn test_send_with_from() { function test_send_without_from_has_no_from_header (line 348) | fn test_send_without_from_has_no_from_header() { function test_send_multiple_to_recipients (line 365) | fn test_send_multiple_to_recipients() { function test_send_crlf_injection_in_from_does_not_create_header (line 383) | fn test_send_crlf_injection_in_from_does_not_create_header() { function test_send_crlf_injection_in_cc_does_not_create_header (line 410) | fn test_send_crlf_injection_in_cc_does_not_create_header() { function test_send_with_attachment_produces_multipart (line 435) | fn test_send_with_attachment_produces_multipart() { FILE: src/helpers/gmail/triage.rs function handle_triage (line 24) | pub async fn handle_triage(matches: &ArgMatches) -> Result<(), GwsError> { function no_messages_msg (line 183) | fn no_messages_msg(query: &str) -> String { function triage_cmd (line 197) | fn triage_cmd() -> Command { function defaults_max_to_20_and_query_to_unread (line 211) | fn defaults_max_to_20_and_query_to_unread() { function explicit_max_overrides_default (line 226) | fn explicit_max_overrides_default() { function non_numeric_max_falls_back_to_20 (line 238) | fn non_numeric_max_falls_back_to_20() { function custom_query_overrides_default (line 250) | fn custom_query_overrides_default() { function labels_flag_defaults_to_false (line 262) | fn labels_flag_defaults_to_false() { function labels_flag_set_when_passed (line 268) | fn labels_flag_set_when_passed() { function format_defaults_to_table_when_absent (line 276) | fn format_defaults_to_table_when_absent() { function format_json_when_specified (line 286) | fn format_json_when_specified() { function empty_result_message_is_not_json (line 298) | fn empty_result_message_is_not_json() { FILE: src/helpers/gmail/watch.rs constant GMAIL_API_BASE (line 7) | const GMAIL_API_BASE: &str = "https://gmail.googleapis.com/gmail/v1"; function handle_watch (line 10) | pub(super) async fn handle_watch( function watch_pull_loop (line 261) | async fn watch_pull_loop( function process_pull_response (line 361) | fn process_pull_response(response: &Value) -> (Vec, u64) { function fetch_and_output_messages (line 398) | async fn fetch_and_output_messages( function apply_sanitization_result (line 496) | fn apply_sanitization_result( function extract_message_ids_from_history (line 526) | fn extract_message_ids_from_history(history_body: &Value) -> Vec { type WatchConfig (line 551) | struct WatchConfig { type WatchRuntime (line 564) | struct WatchRuntime<'a> { function parse_watch_args (line 573) | fn parse_watch_args(matches: &ArgMatches) -> Result ( function test_extract_message_ids_from_history (line 704) | fn test_extract_message_ids_from_history() { function test_extract_message_ids_empty (line 728) | fn test_extract_message_ids_empty() { function test_process_pull_response (line 735) | fn test_process_pull_response() { function make_matches_watch (line 764) | fn make_matches_watch(args: &[&str]) -> ArgMatches { function test_parse_watch_args_invalid_format_rejected_by_clap (line 784) | fn test_parse_watch_args_invalid_format_rejected_by_clap() { function test_parse_watch_args_invalid_output_dir (line 802) | fn test_parse_watch_args_invalid_output_dir() { function test_parse_watch_args_rejects_traversal_subscription (line 811) | fn test_parse_watch_args_rejects_traversal_subscription() { function test_parse_watch_args_full (line 820) | fn test_parse_watch_args_full() { function test_parse_watch_args_defaults (line 846) | fn test_parse_watch_args_defaults() { function test_parse_watch_args_invalid_numbers (line 859) | fn test_parse_watch_args_invalid_numbers() { function test_apply_sanitization_result_block_mode (line 874) | fn test_apply_sanitization_result_block_mode() { function test_apply_sanitization_result_warn_mode (line 891) | fn test_apply_sanitization_result_warn_mode() { function test_apply_sanitization_result_no_match (line 910) | fn test_apply_sanitization_result_no_match() { function test_watch_pull_loop_refreshes_tokens_for_each_request (line 929) | async fn test_watch_pull_loop_refreshes_tokens_for_each_request() { FILE: src/helpers/mod.rs constant PUBSUB_API_BASE (line 34) | pub(crate) const PUBSUB_API_BASE: &str = "https://pubsub.googleapis.com/... function shutdown_signal (line 46) | pub(crate) async fn shutdown_signal() { type Helper (line 94) | pub trait Helper: Send + Sync { method inject_commands (line 96) | fn inject_commands(&self, cmd: Command, doc: &crate::discovery::RestDe... method handle (line 101) | fn handle<'a>( method helper_only (line 109) | fn helper_only(&self) -> bool { function get_helper (line 114) | pub fn get_helper(service: &str) -> Option> { FILE: src/helpers/modelarmor.rs type SanitizationResult (line 29) | pub struct SanitizationResult { type SanitizeMode (line 42) | pub enum SanitizeMode { method from_str (line 73) | pub fn from_str(s: &str) -> Self { type SanitizeConfig (line 51) | pub struct SanitizeConfig { method default (line 60) | fn default() -> Self { type ModelArmorHelper (line 81) | pub struct ModelArmorHelper; function regional_base_url (line 86) | fn regional_base_url(location: &str) -> String { function extract_location (line 92) | fn extract_location(resource_name: &str) -> Option<&str> { method inject_commands (line 103) | fn inject_commands(&self, mut cmd: Command, _doc: &RestDescription) -> C... method helper_only (line 218) | fn helper_only(&self) -> bool { method handle (line 222) | fn handle<'a>( constant CLOUD_PLATFORM_SCOPE (line 246) | pub const CLOUD_PLATFORM_SCOPE: &str = "https://www.googleapis.com/auth/... function sanitize_text (line 250) | pub async fn sanitize_text(template: &str, text: &str) -> Result Result<(), GwsError> { function handle_sanitize (line 313) | async fn handle_sanitize( type CreateTemplateConfig (line 336) | pub struct CreateTemplateConfig { function parse_create_template_args (line 343) | fn parse_create_template_args(matches: &ArgMatches) -> Result String { function handle_create_template (line 381) | async fn handle_create_template(matches: &ArgMatches) -> Result<(), GwsE... function load_preset_template (line 399) | fn load_preset_template(name: &str) -> Result { function test_sanitize_config_default (line 441) | fn test_sanitize_config_default() { function test_sanitize_config_with_template (line 448) | fn test_sanitize_config_with_template() { function test_sanitize_mode_from_str_warn (line 461) | fn test_sanitize_mode_from_str_warn() { function test_sanitize_mode_from_str_block (line 468) | fn test_sanitize_mode_from_str_block() { function test_sanitize_mode_from_str_unknown_defaults_to_warn (line 475) | fn test_sanitize_mode_from_str_unknown_defaults_to_warn() { function test_extract_location_valid (line 482) | fn test_extract_location_valid() { function test_extract_location_different_region (line 490) | fn test_extract_location_different_region() { function test_extract_location_no_locations (line 498) | fn test_extract_location_no_locations() { function test_extract_location_empty (line 503) | fn test_extract_location_empty() { function test_extract_location_trailing_locations (line 508) | fn test_extract_location_trailing_locations() { function test_regional_base_url (line 514) | fn test_regional_base_url() { function test_regional_base_url_different_region (line 522) | fn test_regional_base_url_different_region() { function test_cloud_platform_scope_constant (line 530) | fn test_cloud_platform_scope_constant() { function test_build_sanitize_request_data (line 538) | fn test_build_sanitize_request_data() { function test_parse_sanitize_response_success (line 547) | fn test_parse_sanitize_response_success() { function test_parse_sanitize_response_missing_field (line 562) | fn test_parse_sanitize_response_missing_field() { function build_sanitize_request_data (line 568) | pub fn build_sanitize_request_data( function parse_sanitize_response (line 593) | pub fn parse_sanitize_response(resp_text: &str) -> Result Result... function make_matches (line 643) | fn make_matches(args: &[&str]) -> ArgMatches { function test_parse_sanitize_args_json (line 651) | fn test_parse_sanitize_args_json() { function test_parse_sanitize_args_text (line 658) | fn test_parse_sanitize_args_text() { function test_build_create_template_url (line 666) | fn test_build_create_template_url() { function make_matches_create (line 681) | fn make_matches_create(args: &[&str]) -> ArgMatches { function test_parse_create_template_args_json (line 692) | fn test_parse_create_template_args_json() { function test_parse_create_template_args_preset (line 712) | fn test_parse_create_template_args_preset() { function test_load_preset_template_fallback (line 732) | fn test_load_preset_template_fallback() { function test_inject_commands (line 739) | fn test_inject_commands() { function test_build_create_template_url_encodes_segments (line 752) | fn test_build_create_template_url_encodes_segments() { function test_parse_create_template_args_rejects_traversal (line 766) | fn test_parse_create_template_args_rejects_traversal() { FILE: src/helpers/script.rs type ScriptHelper (line 27) | pub struct ScriptHelper; method inject_commands (line 30) | fn inject_commands( method handle (line 66) | fn handle<'a>( function visit_dirs (line 142) | fn visit_dirs(dir: &Path, files: &mut Vec) -> Result<... function process_file (line 157) | fn process_file(path: &Path) -> Result, GwsErr... function test_process_file_server_js (line 201) | fn test_process_file_server_js() { function test_process_file_html (line 217) | fn test_process_file_html() { function test_process_file_appsscript_json (line 229) | fn test_process_file_appsscript_json() { function test_process_file_ignored (line 241) | fn test_process_file_ignored() { function test_visit_dirs (line 263) | fn test_visit_dirs() { FILE: src/helpers/sheets.rs type SheetsHelper (line 24) | pub struct SheetsHelper; method inject_commands (line 27) | fn inject_commands( method handle (line 97) | fn handle<'a>( function build_append_request (line 200) | fn build_append_request( function build_read_request (line 233) | fn build_read_request( type AppendConfig (line 262) | pub struct AppendConfig { function parse_append_args (line 272) | pub fn parse_append_args(matches: &ArgMatches) -> AppendConfig { type ReadConfig (line 299) | pub struct ReadConfig { function parse_read_args (line 305) | pub fn parse_read_args(matches: &ArgMatches) -> ReadConfig { function make_mock_doc (line 318) | fn make_mock_doc() -> RestDescription { function make_matches_append (line 352) | fn make_matches_append(args: &[&str]) -> ArgMatches { function make_matches_read (line 360) | fn make_matches_read(args: &[&str]) -> ArgMatches { function test_build_append_request (line 368) | fn test_build_append_request() { function test_build_read_request (line 384) | fn test_build_read_request() { function test_parse_append_args_values (line 398) | fn test_parse_append_args_values() { function test_parse_append_args_json_single_row (line 406) | fn test_parse_append_args_json_single_row() { function test_parse_append_args_json_multi_row (line 419) | fn test_parse_append_args_json_multi_row() { function test_build_append_request_multi_row (line 435) | fn test_build_append_request_multi_row() { function test_parse_read_args (line 453) | fn test_parse_read_args() { function test_inject_commands (line 461) | fn test_inject_commands() { FILE: src/helpers/workflows.rs type WorkflowHelper (line 27) | pub struct WorkflowHelper; method inject_commands (line 30) | fn inject_commands( method handle (line 43) | fn handle<'a>( method helper_only (line 74) | fn helper_only(&self) -> bool { function build_standup_report_cmd (line 83) | fn build_standup_report_cmd() -> Command { function build_meeting_prep_cmd (line 105) | fn build_meeting_prep_cmd() -> Command { function build_email_to_task_cmd (line 134) | fn build_email_to_task_cmd() -> Command { function build_weekly_digest_cmd (line 163) | fn build_weekly_digest_cmd() -> Command { function build_file_announce_cmd (line 185) | fn build_file_announce_cmd() -> Command { function get_json (line 232) | async fn get_json( function format_and_print (line 262) | fn format_and_print(value: &Value, matches: &ArgMatches) { function handle_standup_report (line 270) | async fn handle_standup_report(matches: &ArgMatches) -> Result<(), GwsEr... function handle_meeting_prep (line 368) | async fn handle_meeting_prep(matches: &ArgMatches) -> Result<(), GwsErro... function handle_email_to_task (line 445) | async fn handle_email_to_task(matches: &ArgMatches) -> Result<(), GwsErr... function handle_weekly_digest (line 535) | async fn handle_weekly_digest(matches: &ArgMatches) -> Result<(), GwsErr... function handle_file_announce (line 620) | async fn handle_file_announce(matches: &ArgMatches) -> Result<(), GwsErr... function test_inject_commands (line 704) | fn test_inject_commands() { function test_helper_only (line 721) | fn test_helper_only() { function test_build_standup_report_cmd (line 728) | fn test_build_standup_report_cmd() { function test_build_meeting_prep_cmd (line 734) | fn test_build_meeting_prep_cmd() { function test_build_email_to_task_cmd (line 740) | fn test_build_email_to_task_cmd() { function test_build_weekly_digest_cmd (line 755) | fn test_build_weekly_digest_cmd() { function test_build_file_announce_cmd (line 761) | fn test_build_file_announce_cmd() { FILE: src/logging.rs constant ENV_LOG (line 32) | const ENV_LOG: &str = "GOOGLE_WORKSPACE_CLI_LOG"; constant ENV_LOG_FILE (line 35) | const ENV_LOG_FILE: &str = "GOOGLE_WORKSPACE_CLI_LOG_FILE"; function init_logging (line 45) | pub fn init_logging() { function test_init_logging_default_no_panic (line 98) | fn test_init_logging_default_no_panic() { function test_env_var_names (line 108) | fn test_env_var_names() { FILE: src/main.rs function main (line 49) | async fn main() { function run (line 62) | async fn run() -> Result<(), GwsError> { function select_scope (line 309) | pub(crate) fn select_scope(scopes: &[String]) -> Option<&str> { function parse_pagination_config (line 313) | fn parse_pagination_config(matches: &clap::ArgMatches) -> executor::Pagi... function parse_service_and_version (line 321) | pub fn parse_service_and_version( function filter_args_for_subcommand (line 348) | pub fn filter_args_for_subcommand(args: &[String], service_name: &str) -... function parse_sanitize_config (line 373) | fn parse_sanitize_config( function resolve_method_from_matches (line 384) | fn resolve_method_from_matches<'a>( function print_usage (line 440) | fn print_usage() { function is_help_flag (line 516) | fn is_help_flag(arg: &str) -> bool { function is_version_flag (line 520) | fn is_version_flag(arg: &str) -> bool { function test_parse_pagination_config_defaults (line 529) | fn test_parse_pagination_config_defaults() { function test_parse_pagination_config_custom (line 555) | fn test_parse_pagination_config_custom() { function test_parse_sanitize_config_valid (line 588) | fn test_parse_sanitize_config_valid() { function test_parse_sanitize_config_no_template (line 598) | fn test_parse_sanitize_config_no_template() { function test_is_version_flag (line 606) | fn test_is_version_flag() { function test_is_help_flag (line 616) | fn test_is_help_flag() { function test_resolve_method_from_matches_basic (line 624) | fn test_resolve_method_from_matches_basic() { function test_resolve_method_from_matches_nested (line 653) | fn test_resolve_method_from_matches_nested() { function test_filter_args_strips_api_version (line 686) | fn test_filter_args_strips_api_version() { function test_filter_args_no_special_flags (line 700) | fn test_filter_args_no_special_flags() { function test_select_scope_picks_first (line 714) | fn test_select_scope_picks_first() { function test_select_scope_single (line 725) | fn test_select_scope_single() { function test_select_scope_empty (line 734) | fn test_select_scope_empty() { FILE: src/oauth_config.rs type InstalledConfig (line 37) | pub struct InstalledConfig { type ClientSecretFile (line 51) | pub struct ClientSecretFile { function client_config_path (line 56) | pub fn client_config_path() -> PathBuf { function save_client_config (line 61) | pub fn save_client_config( function load_client_config (line 91) | pub fn load_client_config() -> anyhow::Result { function test_save_load_round_trip (line 105) | fn test_save_load_round_trip() { function test_parse_google_console_format (line 137) | fn test_parse_google_console_format() { function test_parse_missing_optional_fields (line 158) | fn test_parse_missing_optional_fields() { function test_parse_invalid_json_fails (line 177) | fn test_parse_invalid_json_fails() { function test_parse_missing_client_id_fails (line 184) | fn test_parse_missing_client_id_fails() { type EnvGuard (line 198) | struct EnvGuard { method new (line 204) | fn new(key: &str, value: &str) -> Self { method drop (line 215) | fn drop(&mut self) { function test_load_client_config (line 226) | fn test_load_client_config() { FILE: src/output.rs function is_dangerous_unicode (line 32) | pub(crate) fn is_dangerous_unicode(c: char) -> bool { function sanitize_for_terminal (line 51) | pub(crate) fn sanitize_for_terminal(text: &str) -> String { function reject_dangerous_chars (line 70) | pub(crate) fn reject_dangerous_chars(value: &str, flag_name: &str) -> Re... function stderr_supports_color (line 90) | pub(crate) fn stderr_supports_color() -> bool { function colorize (line 98) | pub(crate) fn colorize(text: &str, ansi_color: &str) -> String { function status (line 111) | pub(crate) fn status(msg: &str) { function warn (line 118) | pub(crate) fn warn(msg: &str) { function info (line 126) | pub(crate) fn info(msg: &str) { function sanitize_strips_ansi_escape_sequences (line 137) | fn sanitize_strips_ansi_escape_sequences() { function sanitize_preserves_newlines_and_tabs (line 145) | fn sanitize_preserves_newlines_and_tabs() { function sanitize_strips_bell_and_backspace (line 151) | fn sanitize_strips_bell_and_backspace() { function sanitize_strips_carriage_return (line 157) | fn sanitize_strips_carriage_return() { function sanitize_strips_bidi_overrides (line 163) | fn sanitize_strips_bidi_overrides() { function sanitize_strips_zero_width_chars (line 169) | fn sanitize_strips_zero_width_chars() { function sanitize_strips_line_separators (line 175) | fn sanitize_strips_line_separators() { function sanitize_strips_directional_isolates (line 181) | fn sanitize_strips_directional_isolates() { function sanitize_preserves_normal_unicode (line 186) | fn sanitize_preserves_normal_unicode() { function reject_clean_string (line 193) | fn reject_clean_string() { function reject_tab (line 198) | fn reject_tab() { function reject_newline (line 203) | fn reject_newline() { function reject_del (line 208) | fn reject_del() { function reject_zero_width_space (line 213) | fn reject_zero_width_space() { function reject_bom (line 218) | fn reject_bom() { function reject_rtl_override (line 223) | fn reject_rtl_override() { function reject_line_separator (line 228) | fn reject_line_separator() { function reject_paragraph_separator (line 233) | fn reject_paragraph_separator() { function reject_zero_width_joiner (line 238) | fn reject_zero_width_joiner() { function reject_preserves_normal_unicode (line 243) | fn reject_preserves_normal_unicode() { function reject_c1_control_csi (line 250) | fn reject_c1_control_csi() { function colorize_returns_text_in_no_color_mode (line 259) | fn colorize_returns_text_in_no_color_mode() { FILE: src/schema.rs function handle_schema_command (line 34) | pub async fn handle_schema_command(path: &str, resolve_refs: bool) -> Re... function find_method (line 104) | fn find_method<'a>( function build_schema_output (line 146) | fn build_schema_output(doc: &RestDescription, method: &RestMethod) -> Va... function param_to_json (line 192) | fn param_to_json(param: &MethodParameter) -> Value { function schema_to_json (line 223) | fn schema_to_json(schema: &JsonSchema) -> Value { function resolve_schema_refs (line 274) | fn resolve_schema_refs( function test_param_to_json (line 326) | fn test_param_to_json() { function test_param_to_json_repeated (line 356) | fn test_param_to_json_repeated() { function test_schema_to_json_basic (line 370) | fn test_schema_to_json_basic() { function test_resolve_schema_refs_basic (line 393) | fn test_resolve_schema_refs_basic() { function test_resolve_schema_refs_nested (line 420) | fn test_resolve_schema_refs_nested() { FILE: src/services.rs type ServiceEntry (line 18) | pub struct ServiceEntry { constant SERVICES (line 26) | pub const SERVICES: &[ServiceEntry] = &[ function resolve_service (line 132) | pub fn resolve_service(name: &str) -> Result<(String, String), GwsError> { function test_resolve_service_known (line 154) | fn test_resolve_service_known() { function test_resolve_service_unknown (line 170) | fn test_resolve_service_unknown() { FILE: src/setup.rs type ApiEntry (line 31) | struct ApiEntry { constant WORKSPACE_APIS (line 41) | const WORKSPACE_APIS: &[ApiEntry] = &[ constant RESTRICTED_SCOPES (line 176) | const RESTRICTED_SCOPES: &[&str] = &[ constant SENSITIVE_SCOPES (line 198) | const SENSITIVE_SCOPES: &[&str] = &[ function all_api_ids (line 227) | fn all_api_ids() -> Vec<&'static str> { type ScopeClassification (line 232) | pub enum ScopeClassification { constant PLATFORM_SCOPE (line 238) | pub const PLATFORM_SCOPE: &str = "https://www.googleapis.com/auth/cloud-... type DiscoveredScope (line 242) | pub struct DiscoveredScope { function fetch_scopes_for_apis (line 259) | pub async fn fetch_scopes_for_apis(enabled_api_ids: &[String]) -> Vec SetupOptions { function gcloud_bin (line 415) | fn gcloud_bin() -> &'static str { function gcloud_cmd (line 425) | fn gcloud_cmd() -> Command { function is_gcloud_installed (line 432) | pub fn is_gcloud_installed() -> bool { function gcloud_auth_login (line 443) | fn gcloud_auth_login() -> Result<(), GwsError> { function get_gcloud_account (line 456) | fn get_gcloud_account() -> Result, GwsError> { function list_gcloud_accounts (line 475) | fn list_gcloud_accounts() -> Vec<(String, bool)> { function set_gcloud_account (line 499) | fn set_gcloud_account(account: &str) -> Result<(), GwsError> { function get_gcloud_project (line 515) | fn get_gcloud_project() -> Result, GwsError> { function set_gcloud_project (line 533) | fn set_gcloud_project(project_id: &str) -> Result<(), GwsError> { function list_gcloud_projects (line 553) | fn list_gcloud_projects() -> (Vec<(String, String)>, Option) { function get_access_token (line 625) | fn get_access_token() -> Result { function is_tos_precondition_error (line 640) | fn is_tos_precondition_error(gcloud_output: &str) -> bool { function is_invalid_project_id_error (line 647) | fn is_invalid_project_id_error(gcloud_output: &str) -> bool { function is_project_id_in_use_error (line 653) | fn is_project_id_in_use_error(gcloud_output: &str) -> bool { function primary_gcloud_error_line (line 661) | fn primary_gcloud_error_line(gcloud_output: &str) -> Option { function format_project_create_failure (line 669) | fn format_project_create_failure(project_id: &str, account: &str, gcloud... function enable_apis (line 728) | async fn enable_apis( function get_enabled_apis (line 802) | pub fn get_enabled_apis(project_id: &str) -> Vec { function configure_consent_screen (line 837) | async fn configure_consent_screen( constant STEP_LABELS (line 898) | const STEP_LABELS: [&str; 5] = [ type SetupStage (line 906) | enum SetupStage { type SetupContext (line 916) | struct SetupContext { method wiz (line 933) | fn wiz(&mut self, idx: usize, status: StepStatus) { method finish_wizard (line 940) | fn finish_wizard(&mut self) { function stage_check_gcloud (line 948) | fn stage_check_gcloud(ctx: &mut SetupContext) -> Result Result { function stage_project (line 1074) | fn stage_project(ctx: &mut SetupContext) -> Result { function stage_enable_apis (line 1284) | async fn stage_enable_apis(ctx: &mut SetupContext) -> Result String { function stage_configure_oauth (line 1458) | async fn stage_configure_oauth(ctx: &mut SetupContext) -> Result Result { function run_setup (line 1601) | pub async fn run_setup(args: &[String]) -> Result<(), GwsError> { type SetupAction (line 1702) | enum SetupAction { function resolve_account_selection (line 1712) | fn resolve_account_selection(items: &[SelectItem]) -> SetupAction { function resolve_project_selection (line 1720) | fn resolve_project_selection(items: &[SelectItem]) -> SetupAction { function resolve_api_selection (line 1731) | fn resolve_api_selection(items: &[SelectItem]) -> SetupAction { function make_items (line 1743) | fn make_items(labels: &[&str]) -> Vec { function simulate_picker (line 1757) | fn simulate_picker( function test_workspace_api_ids_not_empty (line 1774) | fn test_workspace_api_ids_not_empty() { function test_workspace_api_ids_all_have_googleapis_suffix (line 1779) | fn test_workspace_api_ids_all_have_googleapis_suffix() { function test_workspace_api_ids_no_duplicates (line 1790) | fn test_workspace_api_ids_no_duplicates() { function test_workspace_api_ids_covers_services (line 1798) | fn test_workspace_api_ids_covers_services() { function test_parse_setup_args_empty (line 1828) | fn test_parse_setup_args_empty() { function test_parse_setup_args_with_project (line 1836) | fn test_parse_setup_args_with_project() { function test_parse_setup_args_with_project_equals (line 1844) | fn test_parse_setup_args_with_project_equals() { function test_parse_setup_args_ignores_unknown (line 1852) | fn test_parse_setup_args_ignores_unknown() { function test_parse_setup_args_dry_run (line 1860) | fn test_parse_setup_args_dry_run() { function test_parse_setup_args_dry_run_with_project (line 1868) | fn test_parse_setup_args_dry_run_with_project() { function test_parse_setup_args_login_flag (line 1877) | fn test_parse_setup_args_login_flag() { function test_should_offer_login_prompt_default_interactive (line 1886) | fn test_should_offer_login_prompt_default_interactive() { function test_should_not_offer_login_prompt_when_login_requested (line 1891) | fn test_should_not_offer_login_prompt_when_login_requested() { function test_should_not_offer_login_prompt_non_interactive (line 1896) | fn test_should_not_offer_login_prompt_non_interactive() { function test_should_not_offer_login_prompt_dry_run (line 1901) | fn test_should_not_offer_login_prompt_dry_run() { function test_format_project_create_failure_tos_guidance (line 1906) | fn test_format_project_create_failure_tos_guidance() { function test_format_project_create_failure_invalid_id_guidance (line 1921) | fn test_format_project_create_failure_invalid_id_guidance() { function test_format_project_create_failure_in_use_guidance (line 1935) | fn test_format_project_create_failure_in_use_guidance() { function test_format_project_create_failure_immutable_guidance (line 1947) | fn test_format_project_create_failure_immutable_guidance() { function test_account_select_existing_triggers_set_account (line 1960) | fn test_account_select_existing_triggers_set_account() { function test_account_select_login_new_triggers_login (line 1970) | fn test_account_select_login_new_triggers_login() { function test_account_select_none_returns_no_selection (line 1980) | fn test_account_select_none_returns_no_selection() { function test_project_select_existing (line 1988) | fn test_project_select_existing() { function test_project_select_create_new (line 1998) | fn test_project_select_create_new() { function test_project_select_enter_manually (line 2008) | fn test_project_select_enter_manually() { function test_project_select_none (line 2022) | fn test_project_select_none() { function test_api_select_none_enables_nothing (line 2030) | fn test_api_select_none_enables_nothing() { function test_api_select_first_enables_one (line 2049) | fn test_api_select_first_enables_one() { function test_api_select_all_enables_all (line 2069) | fn test_api_select_all_enables_all() { function test_pipeline_select_account_via_keys (line 2090) | fn test_pipeline_select_account_via_keys() { function test_pipeline_login_new_via_keys (line 2121) | fn test_pipeline_login_new_via_keys() { function test_pipeline_select_project_via_keys (line 2148) | fn test_pipeline_select_project_via_keys() { function test_pipeline_select_all_apis_via_keys (line 2192) | fn test_pipeline_select_all_apis_via_keys() { function test_pipeline_select_two_apis_via_keys (line 2215) | fn test_pipeline_select_two_apis_via_keys() { function test_enable_apis_with_no_apis_to_enable (line 2250) | async fn test_enable_apis_with_no_apis_to_enable() { function test_enable_apis_with_invalid_project (line 2260) | async fn test_enable_apis_with_invalid_project() { function test_failed_apis_json_structure (line 2275) | fn test_failed_apis_json_structure() { function test_failed_apis_json_empty (line 2297) | fn test_failed_apis_json_empty() { function gcloud_bin_returns_platform_appropriate_name (line 2308) | fn gcloud_bin_returns_platform_appropriate_name() { FILE: src/setup_tui.rs type SelectItem (line 37) | pub struct SelectItem { type PickerResult (line 47) | pub enum PickerResult { type InputResult (line 57) | pub enum InputResult { function wrap_text (line 67) | pub fn wrap_text(text: &str, max_width: u16) -> Vec { type PickerState (line 96) | pub struct PickerState { method new (line 137) | pub fn new(title: &str, help_text: &str, items: Vec, multi... method toggle_current (line 150) | fn toggle_current(&mut self) { method toggle_all (line 206) | fn toggle_all(&mut self) { method next (line 219) | fn next(&mut self) { method previous (line 227) | fn previous(&mut self) { method selected_count (line 241) | fn selected_count(&self) -> usize { method handle_key (line 246) | pub fn handle_key(&mut self, code: KeyCode) -> Option { type InputState (line 105) | pub struct InputState { method new (line 111) | pub fn new(title: &str, _help_text: &str, initial: Option<&str>) -> Se... method handle_key (line 118) | pub fn handle_key(&mut self, code: KeyCode) -> Option { function run_picker (line 315) | pub fn run_picker( function run_picker_loop (line 338) | fn run_picker_loop( function drain_pending_events (line 456) | fn drain_pending_events() -> std::io::Result<()> { type StepStatus (line 467) | pub enum StepStatus { type WizardStep (line 476) | struct WizardStep { type SetupWizard (line 483) | pub struct SetupWizard { method start (line 491) | pub fn start(step_labels: &[&str]) -> std::io::Result { method update_step (line 512) | pub fn update_step(&mut self, idx: usize, status: StepStatus) -> std::... method show_message (line 521) | pub fn show_message(&mut self, msg: &str) -> std::io::Result<()> { method suspend (line 527) | pub fn suspend(&mut self) -> std::io::Result<()> { method resume (line 535) | pub fn resume(&mut self) -> std::io::Result<()> { method show_picker (line 543) | pub fn show_picker( method show_input (line 607) | pub fn show_input( method finish (line 662) | pub fn finish(self) -> std::io::Result<()> { method draw_progress (line 669) | fn draw_progress(&mut self) -> std::io::Result<()> { method render_steps (line 689) | fn render_steps( method render_picker (line 770) | fn render_picker( method render_input (line 825) | fn render_input( function make_items (line 860) | fn make_items(labels: &[&str]) -> Vec { function run_keys (line 876) | fn run_keys(state: &mut PickerState, keys: &[KeyCode]) -> Option Vec { function test_template_select_applies_scopes (line 1471) | fn test_template_select_applies_scopes() { function test_template_deselects_other_templates (line 1492) | fn test_template_deselects_other_templates() { function test_toggling_individual_deselects_templates (line 1514) | fn test_toggling_individual_deselects_templates() { function test_deselect_template_does_not_change_individual_items (line 1533) | fn test_deselect_template_does_not_change_individual_items() { function test_selecting_scope_deselects_readonly_counterpart (line 1555) | fn test_selecting_scope_deselects_readonly_counterpart() { function test_selecting_readonly_deselects_write_counterpart (line 1579) | fn test_selecting_readonly_deselects_write_counterpart() { function test_deselecting_scope_does_not_affect_counterpart (line 1602) | fn test_deselecting_scope_does_not_affect_counterpart() { function test_wrap_text_no_wrapping_needed (line 1632) | fn test_wrap_text_no_wrapping_needed() { function test_wrap_text_wraps_long_line (line 1638) | fn test_wrap_text_wraps_long_line() { function test_wrap_text_preserves_newlines (line 1644) | fn test_wrap_text_preserves_newlines() { function test_wrap_text_empty_lines (line 1650) | fn test_wrap_text_empty_lines() { function test_wrap_text_zero_width (line 1656) | fn test_wrap_text_zero_width() { function test_wrap_text_single_long_word (line 1662) | fn test_wrap_text_single_long_word() { function test_wrap_text_multiple_paragraphs_with_wrapping (line 1669) | fn test_wrap_text_multiple_paragraphs_with_wrapping() { function test_picker_starts_at_first_selected_item (line 1677) | fn test_picker_starts_at_first_selected_item() { function test_picker_starts_at_zero_when_none_selected (line 1685) | fn test_picker_starts_at_zero_when_none_selected() { function test_single_item_toggle (line 1694) | fn test_single_item_toggle() { function test_single_item_navigation_wraps (line 1704) | fn test_single_item_navigation_wraps() { function test_fixed_item_in_single_select_preserved (line 1714) | fn test_fixed_item_in_single_select_preserved() { FILE: src/text.rs constant CLI_DESCRIPTION_LIMIT (line 16) | pub const CLI_DESCRIPTION_LIMIT: usize = 200; constant FRONTMATTER_DESCRIPTION_LIMIT (line 19) | pub const FRONTMATTER_DESCRIPTION_LIMIT: usize = 120; constant SKILL_BODY_DESCRIPTION_LIMIT (line 22) | pub const SKILL_BODY_DESCRIPTION_LIMIT: usize = 500; function truncate_description (line 35) | pub fn truncate_description(desc: &str, max_chars: usize, strip_links: b... function strip_markdown_links (line 76) | fn strip_markdown_links(s: &str) -> String { function find_char_from (line 104) | fn find_char_from(chars: &[char], target: char, from: usize) -> Option Option { function rfind_char_boundary (line 134) | fn rfind_char_boundary(s: &str, target: char) -> Option { function short_desc_unchanged (line 144) | fn short_desc_unchanged() { function truncate_at_sentence_boundary (line 150) | fn truncate_at_sentence_boundary() { function truncate_at_word_boundary (line 165) | fn truncate_at_word_boundary() { function hard_cut_no_spaces (line 175) | fn hard_cut_no_spaces() { function strips_markdown_links (line 182) | fn strips_markdown_links() { function preserves_links_when_strip_links_false (line 194) | fn preserves_links_when_strip_links_false() { function strips_markdown_links_and_truncates (line 202) | fn strips_markdown_links_and_truncates() { function multibyte_safe (line 211) | fn multibyte_safe() { function empty_and_whitespace (line 218) | fn empty_and_whitespace() { function test_strip_markdown_links (line 225) | fn test_strip_markdown_links() { function preserves_sentence_ending_at_limit (line 238) | fn preserves_sentence_ending_at_limit() { function does_not_cut_url_looking_periods (line 244) | fn does_not_cut_url_looking_periods() { function sentence_boundary_at_exact_limit (line 254) | fn sentence_boundary_at_exact_limit() { function zero_max_chars (line 262) | fn zero_max_chars() { FILE: src/timezone.rs constant CACHE_FILENAME (line 28) | const CACHE_FILENAME: &str = "account_timezone"; constant CACHE_TTL_SECS (line 31) | const CACHE_TTL_SECS: u64 = 86400; function cache_path (line 34) | fn cache_path() -> PathBuf { function invalidate_cache (line 40) | pub fn invalidate_cache() { function read_cache (line 50) | fn read_cache() -> Option { function write_cache (line 64) | fn write_cache(tz_name: &str) { function fetch_account_timezone (line 78) | async fn fetch_account_timezone(client: &reqwest::Client, token: &str) -... function parse_timezone (line 131) | pub fn parse_timezone(tz_str: &str) -> Result { function resolve_account_timezone (line 144) | pub async fn resolve_account_timezone( function start_of_today (line 188) | pub fn start_of_today(tz: Tz) -> Result, crate::err... function iana_time_zone_fallback (line 207) | fn iana_time_zone_fallback() -> String { function parse_valid_iana_timezone (line 219) | fn parse_valid_iana_timezone() { function parse_utc_timezone (line 225) | fn parse_utc_timezone() { function parse_invalid_timezone_fails (line 231) | fn parse_invalid_timezone_fails() { function parse_empty_string_fails (line 240) | fn parse_empty_string_fails() { function cache_roundtrip (line 246) | fn cache_roundtrip() { function iana_fallback_returns_valid_tz (line 258) | fn iana_fallback_returns_valid_tz() { FILE: src/token_storage.rs type EncryptedTokenStorage (line 25) | pub struct EncryptedTokenStorage { method new (line 32) | pub fn new(path: PathBuf) -> Self { method load_from_disk (line 39) | async fn load_from_disk(&self) -> HashMap { method save_to_disk (line 80) | async fn save_to_disk(&self, map: &HashMap) -> anyh... method cache_key (line 100) | fn cache_key(scopes: &[&str]) -> String { method set (line 110) | async fn set(&self, scopes: &[&str], token: TokenInfo) -> Result<(), Tok... method get (line 128) | async fn get(&self, scopes: &[&str]) -> Option { function test_encrypted_token_storage_new (line 152) | async fn test_encrypted_token_storage_new() { FILE: src/validate.rs function validate_safe_output_dir (line 33) | pub fn validate_safe_output_dir(dir: &str) -> Result { function validate_safe_dir_path (line 81) | pub fn validate_safe_dir_path(dir: &str) -> Result { function validate_safe_file_path (line 138) | pub fn validate_safe_file_path(path_str: &str, flag_name: &str) -> Resul... function normalize_dotdot (line 182) | fn normalize_dotdot(path: &Path) -> PathBuf { function normalize_non_existing (line 200) | fn normalize_non_existing(path: &Path) -> Result { function encode_path_segment (line 238) | pub fn encode_path_segment(s: &str) -> String { function encode_path_preserving_slashes (line 249) | pub fn encode_path_preserving_slashes(s: &str) -> String { function validate_resource_name (line 259) | pub fn validate_resource_name(s: &str) -> Result<&str, GwsError> { function validate_api_identifier (line 295) | pub fn validate_api_identifier(s: &str) -> Result<&str, GwsError> { function test_output_dir_relative_subdir (line 323) | fn test_output_dir_relative_subdir() { function test_output_dir_rejects_symlink_traversal (line 342) | fn test_output_dir_rejects_symlink_traversal() { function test_output_dir_rejects_traversal (line 371) | fn test_output_dir_rejects_traversal() { function test_output_dir_rejects_absolute (line 386) | fn test_output_dir_rejects_absolute() { function test_output_dir_rejects_null_bytes (line 391) | fn test_output_dir_rejects_null_bytes() { function test_output_dir_rejects_control_chars (line 396) | fn test_output_dir_rejects_control_chars() { function test_output_dir_non_existing_subdir (line 402) | fn test_output_dir_non_existing_subdir() { function test_dir_path_cwd (line 420) | fn test_dir_path_cwd() { function test_dir_path_rejects_traversal (line 426) | fn test_dir_path_rejects_traversal() { function test_dir_path_rejects_absolute (line 439) | fn test_dir_path_rejects_absolute() { function test_reject_control_chars_clean (line 446) | fn test_reject_control_chars_clean() { function test_reject_control_chars_tab (line 451) | fn test_reject_control_chars_tab() { function test_reject_control_chars_newline (line 456) | fn test_reject_control_chars_newline() { function test_reject_control_chars_del (line 461) | fn test_reject_control_chars_del() { function test_encode_path_segment_plain_id (line 468) | fn test_encode_path_segment_plain_id() { function test_encode_path_segment_email (line 473) | fn test_encode_path_segment_email() { function test_encode_path_segment_query_injection (line 481) | fn test_encode_path_segment_query_injection() { function test_encode_path_segment_fragment_injection (line 489) | fn test_encode_path_segment_fragment_injection() { function test_encode_path_segment_path_traversal (line 495) | fn test_encode_path_segment_path_traversal() { function test_encode_path_segment_unicode (line 503) | fn test_encode_path_segment_unicode() { function test_encode_path_segment_spaces (line 510) | fn test_encode_path_segment_spaces() { function test_encode_path_segment_already_encoded (line 516) | fn test_encode_path_segment_already_encoded() { function test_encode_path_preserving_slashes_hierarchical_name (line 525) | fn test_encode_path_preserving_slashes_hierarchical_name() { function test_encode_path_preserving_slashes_escapes_reserved_chars (line 531) | fn test_encode_path_preserving_slashes_escapes_reserved_chars() { function test_encode_path_preserving_slashes_spaces_and_unicode (line 537) | fn test_encode_path_preserving_slashes_spaces_and_unicode() { function test_validate_resource_name_valid (line 546) | fn test_validate_resource_name_valid() { function test_validate_resource_name_traversal (line 554) | fn test_validate_resource_name_traversal() { function test_validate_resource_name_control_chars (line 561) | fn test_validate_resource_name_control_chars() { function test_validate_resource_name_empty (line 569) | fn test_validate_resource_name_empty() { function test_validate_resource_name_query_injection (line 574) | fn test_validate_resource_name_query_injection() { function test_validate_resource_name_error_messages_are_clear (line 581) | fn test_validate_resource_name_error_messages_are_clear() { function test_validate_resource_name_percent_bypass (line 593) | fn test_validate_resource_name_percent_bypass() { function test_reject_control_chars_zero_width_space (line 604) | fn test_reject_control_chars_zero_width_space() { function test_reject_control_chars_bom (line 610) | fn test_reject_control_chars_bom() { function test_reject_control_chars_rtl_override (line 616) | fn test_reject_control_chars_rtl_override() { function test_reject_control_chars_unicode_line_separator (line 622) | fn test_reject_control_chars_unicode_line_separator() { function test_reject_control_chars_paragraph_separator (line 628) | fn test_reject_control_chars_paragraph_separator() { function test_reject_control_chars_zero_width_joiner (line 634) | fn test_reject_control_chars_zero_width_joiner() { function test_reject_control_chars_normal_unicode_ok (line 640) | fn test_reject_control_chars_normal_unicode_ok() { function test_output_dir_rejects_zero_width_chars (line 650) | fn test_output_dir_rejects_zero_width_chars() { function test_output_dir_rejects_rtl_override (line 656) | fn test_output_dir_rejects_rtl_override() { function test_output_dir_rejects_unicode_line_separator (line 661) | fn test_output_dir_rejects_unicode_line_separator() { function test_validate_resource_name_zero_width_chars (line 668) | fn test_validate_resource_name_zero_width_chars() { function test_validate_resource_name_unicode_line_seps (line 676) | fn test_validate_resource_name_unicode_line_seps() { function test_validate_resource_name_rtl_override (line 682) | fn test_validate_resource_name_rtl_override() { function test_validate_resource_name_bidi_embedding (line 687) | fn test_validate_resource_name_bidi_embedding() { function test_validate_resource_name_homoglyphs_pass_through (line 694) | fn test_validate_resource_name_homoglyphs_pass_through() { function test_validate_resource_name_overlong_accepted (line 701) | fn test_validate_resource_name_overlong_accepted() { function test_validate_api_identifier_valid (line 710) | fn test_validate_api_identifier_valid() { function test_validate_api_identifier_rejects_path_traversal (line 725) | fn test_validate_api_identifier_rejects_path_traversal() { function test_validate_api_identifier_rejects_special_chars (line 731) | fn test_validate_api_identifier_rejects_special_chars() { function test_validate_api_identifier_empty (line 740) | fn test_validate_api_identifier_empty() { function test_file_path_relative_is_ok (line 748) | fn test_file_path_relative_is_ok() { function test_file_path_rejects_traversal (line 764) | fn test_file_path_rejects_traversal() { function test_file_path_rejects_control_chars (line 782) | fn test_file_path_rejects_control_chars() { function test_file_path_rejects_symlink_escape (line 789) | fn test_file_path_rejects_symlink_escape() { function test_file_path_rejects_traversal_via_nonexistent_prefix (line 811) | fn test_file_path_rejects_traversal_via_nonexistent_prefix() {