smbcloud-cli 0.4.10__tar.gz → 0.4.12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/Cargo.lock +16 -16
  2. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/PKG-INFO +2 -2
  3. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/Cargo.toml +2 -2
  4. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/cli/mod.rs +11 -1
  5. smbcloud_cli-0.4.12/crates/cli/src/cloud-auth/auth_app.rs +85 -0
  6. smbcloud_cli-0.4.12/crates/cli/src/cloud-auth/cli.rs +38 -0
  7. smbcloud_cli-0.4.12/crates/cli/src/cloud-auth/mod.rs +6 -0
  8. smbcloud_cli-0.4.12/crates/cli/src/cloud-auth/process.rs +193 -0
  9. smbcloud_cli-0.4.12/crates/cli/src/cloud-auth/render.rs +45 -0
  10. smbcloud_cli-0.4.12/crates/cli/src/cloud-auth/url_builder.rs +28 -0
  11. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_migrate.rs +1 -0
  12. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/setup_create_new_project.rs +2 -0
  13. smbcloud_cli-0.4.12/crates/cli/src/cloud-mail/current_project.rs +24 -0
  14. smbcloud_cli-0.4.10/crates/cli/src/mail.rs → smbcloud_cli-0.4.12/crates/cli/src/cloud-mail/mod.rs +1 -1
  15. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/lib.rs +6 -0
  16. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/main.rs +6 -0
  17. smbcloud_cli-0.4.12/crates/cli/src/mcp.rs +946 -0
  18. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/crud_create.rs +2 -0
  19. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/crud_delete.rs +15 -5
  20. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/crud_read.rs +7 -33
  21. smbcloud_cli-0.4.12/crates/cli/src/session_config.rs +134 -0
  22. smbcloud_cli-0.4.12/crates/cli/src/tenant/cli.rs +34 -0
  23. smbcloud_cli-0.4.12/crates/cli/src/tenant/mod.rs +6 -0
  24. smbcloud_cli-0.4.12/crates/cli/src/tenant/process.rs +219 -0
  25. smbcloud_cli-0.4.12/crates/cli/src/tenant/render.rs +50 -0
  26. smbcloud_cli-0.4.12/crates/cli/src/tenant/request.rs +30 -0
  27. smbcloud_cli-0.4.12/crates/cli/src/tenant/tenant_client.rs +84 -0
  28. smbcloud_cli-0.4.12/crates/cli/src/tenant/url_builder.rs +21 -0
  29. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/prompt.rs +74 -0
  30. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/Cargo.toml +2 -2
  31. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/Cargo.toml +2 -2
  32. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/Cargo.toml +2 -2
  33. smbcloud_cli-0.4.12/crates/smbcloud-mail/src/request.rs +30 -0
  34. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/Cargo.toml +2 -2
  35. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/app_auth.rs +22 -3
  36. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/lib.rs +1 -0
  37. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/project.rs +11 -2
  38. smbcloud_cli-0.4.12/crates/smbcloud-model/src/tenant.rs +121 -0
  39. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-network/Cargo.toml +2 -2
  40. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-network/src/network.rs +10 -19
  41. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking/Cargo.toml +2 -2
  42. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/Cargo.toml +2 -2
  43. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_create.rs +9 -1
  44. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_delete.rs +3 -3
  45. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/lib.rs +1 -0
  46. smbcloud_cli-0.4.12/crates/smbcloud-networking-project/src/request.rs +34 -0
  47. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-utils/Cargo.toml +2 -2
  48. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-utils/src/lib.rs +2 -14
  49. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/pyproject.toml +1 -1
  50. smbcloud_cli-0.4.10/crates/cli/src/mail/current_project.rs +0 -43
  51. smbcloud_cli-0.4.10/crates/cli/src/mcp.rs +0 -236
  52. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/Cargo.toml +0 -0
  53. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/README.md +0 -0
  54. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/README.md +0 -0
  55. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/cli.rs +0 -0
  56. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/forgot/mod.rs +0 -0
  57. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/lib.rs +0 -0
  58. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/login/mod.rs +0 -0
  59. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/login/process.rs +0 -0
  60. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/logout/mod.rs +0 -0
  61. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/me/mod.rs +0 -0
  62. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/mod.rs +0 -0
  63. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/signup/mod.rs +0 -0
  64. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/account/signup/process.rs +0 -0
  65. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ci.rs +0 -0
  66. {smbcloud_cli-0.4.10/crates/smbcloud-mail/src → smbcloud_cli-0.4.12/crates/cli/src/cloud-auth}/request.rs +0 -0
  67. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/config.rs +0 -0
  68. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/git.rs +0 -0
  69. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/mod.rs +0 -0
  70. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_deploy.rs +0 -0
  71. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_deploy_nextjs_ssr.rs +0 -0
  72. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_deploy_rails.rs +0 -0
  73. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_deploy_rust.rs +0 -0
  74. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_deploy_swift.rs +0 -0
  75. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/process_deploy_vite_spa.rs +0 -0
  76. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/remote_messages.rs +0 -0
  77. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/setup.rs +0 -0
  78. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/setup_project.rs +0 -0
  79. {smbcloud_cli-0.4.10/crates/cli/src/deploy → smbcloud_cli-0.4.12/crates/cli/src/cloud-deploy}/setup_select_project.rs +0 -0
  80. {smbcloud_cli-0.4.10/crates/cli/src/mail → smbcloud_cli-0.4.12/crates/cli/src/cloud-mail}/cli.rs +0 -0
  81. {smbcloud_cli-0.4.10/crates/cli/src/mail → smbcloud_cli-0.4.12/crates/cli/src/cloud-mail}/process.rs +0 -0
  82. {smbcloud_cli-0.4.10/crates/cli/src/mail → smbcloud_cli-0.4.12/crates/cli/src/cloud-mail}/render.rs +0 -0
  83. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/interface.rs +0 -0
  84. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/cli.rs +0 -0
  85. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/crud_update.rs +0 -0
  86. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/deploy_target.rs +0 -0
  87. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/deployment.rs +0 -0
  88. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/mod.rs +0 -0
  89. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/project/process.rs +0 -0
  90. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/token/clear_smb_token.rs +0 -0
  91. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/token/get_smb_token.rs +0 -0
  92. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/token/is_logged_in.rs +0 -0
  93. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/token/mod.rs +0 -0
  94. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/token/smb_token_file_path.rs +0 -0
  95. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/confirm_dialog.rs +0 -0
  96. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/deployment_detail_view.rs +0 -0
  97. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/deployment_table.rs +0 -0
  98. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/me_view.rs +0 -0
  99. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/mod.rs +0 -0
  100. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/plain.rs +0 -0
  101. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/project_detail_view.rs +0 -0
  102. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/project_table.rs +0 -0
  103. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/reporter.rs +0 -0
  104. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/cli/src/ui/theme.rs +0 -0
  105. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/.gitignore +0 -0
  106. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/README.md +0 -0
  107. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/check_email.rs +0 -0
  108. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/lib.rs +0 -0
  109. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/login.rs +0 -0
  110. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/logout.rs +0 -0
  111. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/me.rs +0 -0
  112. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/oauth/get_account_status.rs +0 -0
  113. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/oauth/get_consent_url.rs +0 -0
  114. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/oauth/get_profile.rs +0 -0
  115. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/oauth/get_token.rs +0 -0
  116. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/oauth/mod.rs +0 -0
  117. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/oauth/provider.rs +0 -0
  118. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/remove.rs +0 -0
  119. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/resend_email_verification.rs +0 -0
  120. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/resend_reset_password_instruction.rs +0 -0
  121. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/reset_password.rs +0 -0
  122. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-auth/src/signup.rs +0 -0
  123. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/README.md +0 -0
  124. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/build.rs +0 -0
  125. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/error.rs +0 -0
  126. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/known_hosts.rs +0 -0
  127. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/lib.rs +0 -0
  128. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/report.rs +0 -0
  129. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/runner.rs +0 -0
  130. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-deploy/src/transport.rs +0 -0
  131. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/README.md +0 -0
  132. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/src/mail_app.rs +0 -0
  133. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/src/mail_inbox.rs +0 -0
  134. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/src/mail_message.rs +0 -0
  135. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/src/smbcloud_mail.rs +0 -0
  136. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-mail/src/url_builder.rs +0 -0
  137. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/README.md +0 -0
  138. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/account.rs +0 -0
  139. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/deploy_config.rs +0 -0
  140. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/deploy_config_update.rs +0 -0
  141. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/error_codes.rs +0 -0
  142. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/forgot.rs +0 -0
  143. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/frontend_app.rs +0 -0
  144. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/login.rs +0 -0
  145. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/mail.rs +0 -0
  146. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/oauth.rs +0 -0
  147. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/repository.rs +0 -0
  148. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/reset_password_response.rs +0 -0
  149. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/runner.rs +0 -0
  150. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-model/src/signup.rs +0 -0
  151. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-network/README.md +0 -0
  152. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-network/src/environment.rs +0 -0
  153. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-network/src/lib.rs +0 -0
  154. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking/README.md +0 -0
  155. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking/src/constants.rs +0 -0
  156. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking/src/lib.rs +0 -0
  157. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking/src/smb_client.rs +0 -0
  158. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/README.md +0 -0
  159. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_deploy_repo_create.rs +0 -0
  160. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_frontend_app_create.rs +0 -0
  161. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_frontend_app_deploy_config.rs +0 -0
  162. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_frontend_app_read.rs +0 -0
  163. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_frontend_app_update_deploy_config.rs +0 -0
  164. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_deployment_create.rs +0 -0
  165. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_deployment_read.rs +0 -0
  166. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_deployment_update.rs +0 -0
  167. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_read.rs +0 -0
  168. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/crud_project_update.rs +0 -0
  169. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-networking-project/src/url_builder.rs +0 -0
  170. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-utils/README.md +0 -0
  171. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-utils/src/config.rs +0 -0
  172. {smbcloud_cli-0.4.10 → smbcloud_cli-0.4.12}/crates/smbcloud-utils/src/write_config.rs +0 -0
@@ -2528,7 +2528,7 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
2528
2528
 
2529
2529
  [[package]]
2530
2530
  name = "smbcloud-auth"
2531
- version = "0.4.10"
2531
+ version = "0.4.12"
2532
2532
  dependencies = [
2533
2533
  "log",
2534
2534
  "reqwest",
@@ -2543,7 +2543,7 @@ dependencies = [
2543
2543
 
2544
2544
  [[package]]
2545
2545
  name = "smbcloud-auth-sdk"
2546
- version = "0.4.10"
2546
+ version = "0.4.12"
2547
2547
  dependencies = [
2548
2548
  "base64",
2549
2549
  "reqwest",
@@ -2558,7 +2558,7 @@ dependencies = [
2558
2558
 
2559
2559
  [[package]]
2560
2560
  name = "smbcloud-auth-sdk-py"
2561
- version = "0.4.10"
2561
+ version = "0.4.12"
2562
2562
  dependencies = [
2563
2563
  "pyo3",
2564
2564
  "pythonize",
@@ -2572,7 +2572,7 @@ dependencies = [
2572
2572
 
2573
2573
  [[package]]
2574
2574
  name = "smbcloud-auth-sdk-wasm"
2575
- version = "0.4.10"
2575
+ version = "0.4.12"
2576
2576
  dependencies = [
2577
2577
  "serde-wasm-bindgen",
2578
2578
  "smbcloud-auth-sdk",
@@ -2585,7 +2585,7 @@ dependencies = [
2585
2585
 
2586
2586
  [[package]]
2587
2587
  name = "smbcloud-cli"
2588
- version = "0.4.10"
2588
+ version = "0.4.12"
2589
2589
  dependencies = [
2590
2590
  "anyhow",
2591
2591
  "chrono",
@@ -2631,7 +2631,7 @@ dependencies = [
2631
2631
 
2632
2632
  [[package]]
2633
2633
  name = "smbcloud-deploy"
2634
- version = "0.4.10"
2634
+ version = "0.4.12"
2635
2635
  dependencies = [
2636
2636
  "anyhow",
2637
2637
  "smbcloud-model",
@@ -2643,7 +2643,7 @@ dependencies = [
2643
2643
 
2644
2644
  [[package]]
2645
2645
  name = "smbcloud-email-sdk"
2646
- version = "0.4.10"
2646
+ version = "0.4.12"
2647
2647
  dependencies = [
2648
2648
  "anyhow",
2649
2649
  "log",
@@ -2658,7 +2658,7 @@ dependencies = [
2658
2658
 
2659
2659
  [[package]]
2660
2660
  name = "smbcloud-gresiq"
2661
- version = "0.4.10"
2661
+ version = "0.4.12"
2662
2662
  dependencies = [
2663
2663
  "native-tls",
2664
2664
  "postgres-native-tls",
@@ -2672,7 +2672,7 @@ dependencies = [
2672
2672
 
2673
2673
  [[package]]
2674
2674
  name = "smbcloud-gresiq-sdk"
2675
- version = "0.4.10"
2675
+ version = "0.4.12"
2676
2676
  dependencies = [
2677
2677
  "anyhow",
2678
2678
  "log",
@@ -2686,7 +2686,7 @@ dependencies = [
2686
2686
 
2687
2687
  [[package]]
2688
2688
  name = "smbcloud-mail"
2689
- version = "0.4.10"
2689
+ version = "0.4.12"
2690
2690
  dependencies = [
2691
2691
  "reqwest",
2692
2692
  "serde",
@@ -2698,7 +2698,7 @@ dependencies = [
2698
2698
 
2699
2699
  [[package]]
2700
2700
  name = "smbcloud-model"
2701
- version = "0.4.10"
2701
+ version = "0.4.12"
2702
2702
  dependencies = [
2703
2703
  "chrono",
2704
2704
  "log",
@@ -2714,7 +2714,7 @@ dependencies = [
2714
2714
 
2715
2715
  [[package]]
2716
2716
  name = "smbcloud-network"
2717
- version = "0.4.10"
2717
+ version = "0.4.12"
2718
2718
  dependencies = [
2719
2719
  "clap 4.6.2",
2720
2720
  "log",
@@ -2727,7 +2727,7 @@ dependencies = [
2727
2727
 
2728
2728
  [[package]]
2729
2729
  name = "smbcloud-networking"
2730
- version = "0.4.10"
2730
+ version = "0.4.12"
2731
2731
  dependencies = [
2732
2732
  "smbcloud-network",
2733
2733
  "url-builder",
@@ -2735,7 +2735,7 @@ dependencies = [
2735
2735
 
2736
2736
  [[package]]
2737
2737
  name = "smbcloud-networking-project"
2738
- version = "0.4.10"
2738
+ version = "0.4.12"
2739
2739
  dependencies = [
2740
2740
  "anyhow",
2741
2741
  "async-trait",
@@ -2753,11 +2753,11 @@ dependencies = [
2753
2753
 
2754
2754
  [[package]]
2755
2755
  name = "smbcloud-s6n"
2756
- version = "0.4.10"
2756
+ version = "0.4.12"
2757
2757
 
2758
2758
  [[package]]
2759
2759
  name = "smbcloud-utils"
2760
- version = "0.4.10"
2760
+ version = "0.4.12"
2761
2761
  dependencies = [
2762
2762
  "anyhow",
2763
2763
  "dirs",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smbcloud-cli
3
- Version: 0.4.10
3
+ Version: 0.4.12
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -15,7 +15,7 @@ Classifier: Topic :: System :: Systems Administration
15
15
  Classifier: Topic :: Utilities
16
16
  Summary: smbCloud command line interface.
17
17
  Keywords: cli,cloud,smbcloud,web2,web3
18
- Author-email: Seto Elkahfi <hej@setoelkahfi.se>
18
+ Author-email: Seto Elkahfi <seto@smbcloud.xyz>
19
19
  License: Apache-2.0
20
20
  Requires-Python: >=3.8
21
21
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
@@ -1,8 +1,8 @@
1
1
  [package]
2
2
  name = "smbcloud-cli"
3
- version = "0.4.10"
3
+ version = "0.4.12"
4
4
  edition = "2021"
5
- authors = ["Seto Elkahfi <hej@setoelkahfi.se>"]
5
+ authors = ["Seto Elkahfi <seto@smbcloud.xyz>"]
6
6
  description = "smbCloud command line interface."
7
7
  license = "Apache-2.0"
8
8
  repository = "https://github.com/smbcloudXYZ/smbcloud-cli"
@@ -1,5 +1,5 @@
1
1
  use {
2
- crate::{account, mail, project},
2
+ crate::{account, cloud_auth, mail, project, tenant},
3
3
  clap::{Parser, Subcommand},
4
4
  smbcloud_network::environment::Environment,
5
5
  spinners::Spinner,
@@ -81,11 +81,21 @@ pub enum Commands {
81
81
  #[clap(subcommand)]
82
82
  command: project::cli::Commands,
83
83
  },
84
+ #[clap(about = "Manage your tenants.")]
85
+ Tenant {
86
+ #[clap(subcommand)]
87
+ command: tenant::cli::Commands,
88
+ },
84
89
  #[clap(about = "Manage smbCloud Mail.")]
85
90
  Mail {
86
91
  #[clap(subcommand)]
87
92
  command: mail::cli::Commands,
88
93
  },
94
+ #[clap(about = "Manage smbCloud Auth apps.")]
95
+ Auth {
96
+ #[clap(subcommand)]
97
+ command: cloud_auth::cli::Commands,
98
+ },
89
99
  #[clap(
90
100
  about = "Migrate local .smb/config.toml deploy fields to the smbCloud server.",
91
101
  display_order = 4
@@ -0,0 +1,85 @@
1
+ use crate::cloud_auth::{
2
+ request::request_empty,
3
+ url_builder::{build_auth_app_url, build_auth_apps_url},
4
+ };
5
+ use reqwest::Client;
6
+ use serde::Serialize;
7
+ use smbcloud_model::{
8
+ app_auth::{AuthApp, AuthAppCreate, AuthAppUpdate},
9
+ error_codes::ErrorResponse,
10
+ };
11
+ use smbcloud_network::{environment::Environment, network::request};
12
+ use smbcloud_networking::{constants::SMB_USER_AGENT, smb_client::SmbClient};
13
+
14
+ #[derive(Serialize)]
15
+ struct AuthAppEnvelope<T> {
16
+ auth_app: T,
17
+ }
18
+
19
+ pub async fn get_auth_apps(
20
+ env: Environment,
21
+ client: (&SmbClient, &str),
22
+ access_token: String,
23
+ project_id: Option<String>,
24
+ ) -> Result<Vec<AuthApp>, ErrorResponse> {
25
+ let builder = Client::new()
26
+ .get(build_auth_apps_url(env, client, project_id.as_deref()))
27
+ .header("Authorization", access_token)
28
+ .header("User-agent", SMB_USER_AGENT);
29
+ request(builder).await
30
+ }
31
+
32
+ pub async fn get_auth_app(
33
+ env: Environment,
34
+ client: (&SmbClient, &str),
35
+ access_token: String,
36
+ auth_app_id: String,
37
+ ) -> Result<AuthApp, ErrorResponse> {
38
+ let builder = Client::new()
39
+ .get(build_auth_app_url(env, client, &auth_app_id))
40
+ .header("Authorization", access_token)
41
+ .header("User-agent", SMB_USER_AGENT);
42
+ request(builder).await
43
+ }
44
+
45
+ pub async fn create_auth_app(
46
+ env: Environment,
47
+ client: (&SmbClient, &str),
48
+ access_token: String,
49
+ auth_app: AuthAppCreate,
50
+ ) -> Result<AuthApp, ErrorResponse> {
51
+ let builder = Client::new()
52
+ .post(build_auth_apps_url(env, client, None))
53
+ .json(&AuthAppEnvelope { auth_app })
54
+ .header("Authorization", access_token)
55
+ .header("User-agent", SMB_USER_AGENT);
56
+ request(builder).await
57
+ }
58
+
59
+ pub async fn update_auth_app(
60
+ env: Environment,
61
+ client: (&SmbClient, &str),
62
+ access_token: String,
63
+ auth_app_id: String,
64
+ auth_app: AuthAppUpdate,
65
+ ) -> Result<AuthApp, ErrorResponse> {
66
+ let builder = Client::new()
67
+ .put(build_auth_app_url(env, client, &auth_app_id))
68
+ .json(&AuthAppEnvelope { auth_app })
69
+ .header("Authorization", access_token)
70
+ .header("User-agent", SMB_USER_AGENT);
71
+ request(builder).await
72
+ }
73
+
74
+ pub async fn delete_auth_app(
75
+ env: Environment,
76
+ client: (&SmbClient, &str),
77
+ access_token: String,
78
+ auth_app_id: String,
79
+ ) -> Result<(), ErrorResponse> {
80
+ let builder = Client::new()
81
+ .delete(build_auth_app_url(env, client, &auth_app_id))
82
+ .header("Authorization", access_token)
83
+ .header("User-agent", SMB_USER_AGENT);
84
+ request_empty(builder).await
85
+ }
@@ -0,0 +1,38 @@
1
+ use clap::Subcommand;
2
+
3
+ #[derive(Subcommand)]
4
+ pub enum Commands {
5
+ #[clap(about = "List your Auth apps.")]
6
+ List {
7
+ #[clap(long)]
8
+ project_id: Option<String>,
9
+ },
10
+ #[clap(about = "Show an Auth app.")]
11
+ Show {
12
+ #[clap(long, required = true)]
13
+ id: String,
14
+ },
15
+ #[clap(about = "Create an Auth app.")]
16
+ New {
17
+ #[clap(long, required = true)]
18
+ name: String,
19
+ #[clap(long)]
20
+ project_id: Option<String>,
21
+ #[clap(long)]
22
+ support_email: Option<String>,
23
+ },
24
+ #[clap(about = "Update an Auth app.")]
25
+ Update {
26
+ #[clap(long, required = true)]
27
+ id: String,
28
+ #[clap(long)]
29
+ name: Option<String>,
30
+ #[clap(long)]
31
+ support_email: Option<String>,
32
+ },
33
+ #[clap(about = "Delete an Auth app.")]
34
+ Delete {
35
+ #[clap(long, required = true)]
36
+ id: String,
37
+ },
38
+ }
@@ -0,0 +1,6 @@
1
+ pub mod auth_app;
2
+ pub mod cli;
3
+ pub mod process;
4
+ mod render;
5
+ mod request;
6
+ mod url_builder;
@@ -0,0 +1,193 @@
1
+ use crate::{
2
+ cli::CommandResult,
3
+ client,
4
+ cloud_auth::{
5
+ auth_app::{
6
+ create_auth_app, delete_auth_app, get_auth_app, get_auth_apps, update_auth_app,
7
+ },
8
+ cli::Commands,
9
+ render::{print_auth_app_detail, print_auth_apps},
10
+ },
11
+ mail::current_project::{resolve_optional_project_id, resolve_required_project_id},
12
+ token::get_smb_token::get_smb_token,
13
+ ui::{fail_message, fail_symbol, prompt::confirm_delete, succeed_message, succeed_symbol},
14
+ };
15
+ use anyhow::{anyhow, Result};
16
+ use smbcloud_model::app_auth::{AuthAppCreate, AuthAppUpdate};
17
+ use smbcloud_network::environment::Environment;
18
+ use spinners::Spinner;
19
+
20
+ pub async fn process_cloud_auth(env: Environment, commands: Commands) -> Result<CommandResult> {
21
+ match commands {
22
+ Commands::List { project_id } => process_auth_app_list(env, project_id).await,
23
+ Commands::Show { id } => process_auth_app_show(env, id).await,
24
+ Commands::New {
25
+ name,
26
+ project_id,
27
+ support_email,
28
+ } => process_auth_app_new(env, name, project_id, support_email).await,
29
+ Commands::Update {
30
+ id,
31
+ name,
32
+ support_email,
33
+ } => process_auth_app_update(env, id, name, support_email).await,
34
+ Commands::Delete { id } => process_auth_app_delete(env, id).await,
35
+ }
36
+ }
37
+
38
+ async fn process_auth_app_list(
39
+ env: Environment,
40
+ project_id: Option<String>,
41
+ ) -> Result<CommandResult> {
42
+ let access_token = get_smb_token(env)?;
43
+ let resolved_project_id = resolve_optional_project_id(env, normalize_optional(project_id))?;
44
+ let mut spinner = loading_spinner("Loading Auth apps");
45
+
46
+ let auth_apps = get_auth_apps(env, client(), access_token, resolved_project_id)
47
+ .await
48
+ .map_err(api_error)?;
49
+
50
+ spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
51
+ print_auth_apps(&auth_apps);
52
+
53
+ Ok(done_result(if auth_apps.is_empty() {
54
+ "No Auth apps found."
55
+ } else {
56
+ "Done."
57
+ }))
58
+ }
59
+
60
+ async fn process_auth_app_show(env: Environment, id: String) -> Result<CommandResult> {
61
+ let access_token = get_smb_token(env)?;
62
+ let auth_app_id = normalize_required("Auth app id", id)?;
63
+ let mut spinner = loading_spinner("Loading Auth app");
64
+
65
+ let auth_app = get_auth_app(env, client(), access_token, auth_app_id)
66
+ .await
67
+ .map_err(api_error)?;
68
+
69
+ spinner.stop_and_persist(&succeed_symbol(), succeed_message("Loaded."));
70
+ print_auth_app_detail(&auth_app);
71
+
72
+ Ok(done_result("Done."))
73
+ }
74
+
75
+ async fn process_auth_app_new(
76
+ env: Environment,
77
+ name: String,
78
+ project_id: Option<String>,
79
+ support_email: Option<String>,
80
+ ) -> Result<CommandResult> {
81
+ let access_token = get_smb_token(env)?;
82
+ let auth_app = AuthAppCreate {
83
+ name: normalize_required("name", name)?,
84
+ project_id: resolve_required_project_id(env, normalize_optional(project_id))?,
85
+ support_email: normalize_optional(support_email),
86
+ };
87
+ let mut spinner = loading_spinner("Creating Auth app");
88
+
89
+ let auth_app = create_auth_app(env, client(), access_token, auth_app)
90
+ .await
91
+ .map_err(api_error)?;
92
+
93
+ spinner.stop_and_persist(&succeed_symbol(), succeed_message("Created."));
94
+ print_auth_app_detail(&auth_app);
95
+
96
+ Ok(done_result("Auth app created."))
97
+ }
98
+
99
+ async fn process_auth_app_update(
100
+ env: Environment,
101
+ id: String,
102
+ name: Option<String>,
103
+ support_email: Option<String>,
104
+ ) -> Result<CommandResult> {
105
+ let access_token = get_smb_token(env)?;
106
+ let auth_app_id = normalize_required("Auth app id", id)?;
107
+ let update = AuthAppUpdate {
108
+ name: normalize_optional(name),
109
+ support_email: normalize_optional(support_email),
110
+ };
111
+
112
+ if update.is_empty() {
113
+ return Err(anyhow!(
114
+ "Specify at least one of `--name` or `--support-email`."
115
+ ));
116
+ }
117
+
118
+ let mut spinner = loading_spinner("Updating Auth app");
119
+ let auth_app = update_auth_app(env, client(), access_token, auth_app_id, update)
120
+ .await
121
+ .map_err(api_error)?;
122
+
123
+ spinner.stop_and_persist(&succeed_symbol(), succeed_message("Updated."));
124
+ print_auth_app_detail(&auth_app);
125
+
126
+ Ok(done_result("Auth app updated."))
127
+ }
128
+
129
+ async fn process_auth_app_delete(env: Environment, id: String) -> Result<CommandResult> {
130
+ let auth_app_id = normalize_required("Auth app id", id)?;
131
+ let confirmed = confirm_delete(
132
+ "Auth app deletion confirmation",
133
+ &format!("Delete Auth app #{auth_app_id}"),
134
+ )?;
135
+
136
+ if !confirmed {
137
+ return Ok(done_result("Cancelled."));
138
+ }
139
+
140
+ let access_token = get_smb_token(env)?;
141
+ let spinner = loading_spinner("Deleting Auth app");
142
+
143
+ match delete_auth_app(env, client(), access_token, auth_app_id).await {
144
+ Ok(()) => Ok(CommandResult {
145
+ spinner,
146
+ symbol: succeed_symbol(),
147
+ msg: succeed_message("Done. Auth app has been deleted."),
148
+ }),
149
+ Err(error) => Ok(CommandResult {
150
+ spinner,
151
+ symbol: fail_symbol(),
152
+ msg: fail_message(&error.to_string()),
153
+ }),
154
+ }
155
+ }
156
+
157
+ fn loading_spinner(message: &str) -> Spinner {
158
+ Spinner::new(
159
+ spinners::Spinners::SimpleDotsScrolling,
160
+ succeed_message(message),
161
+ )
162
+ }
163
+
164
+ fn done_result(message: &str) -> CommandResult {
165
+ CommandResult {
166
+ spinner: loading_spinner("Done"),
167
+ symbol: succeed_symbol(),
168
+ msg: succeed_message(message),
169
+ }
170
+ }
171
+
172
+ fn normalize_required(label: &str, value: String) -> Result<String> {
173
+ let normalized_value = value.trim().to_string();
174
+ if normalized_value.is_empty() {
175
+ return Err(anyhow!("{} cannot be empty.", label));
176
+ }
177
+ Ok(normalized_value)
178
+ }
179
+
180
+ fn normalize_optional(value: Option<String>) -> Option<String> {
181
+ value.and_then(|value| {
182
+ let normalized_value = value.trim().to_string();
183
+ if normalized_value.is_empty() {
184
+ None
185
+ } else {
186
+ Some(normalized_value)
187
+ }
188
+ })
189
+ }
190
+
191
+ fn api_error(error: impl std::fmt::Display) -> anyhow::Error {
192
+ anyhow!(error.to_string())
193
+ }
@@ -0,0 +1,45 @@
1
+ use console::style;
2
+ use smbcloud_model::app_auth::AuthApp;
3
+
4
+ fn print_heading(title: &str) {
5
+ println!("\n{}", style(title).bold().underlined());
6
+ }
7
+
8
+ fn print_field(label: &str, value: impl AsRef<str>) {
9
+ println!("{} {}", style(format!("{label}:")).cyan(), value.as_ref());
10
+ }
11
+
12
+ fn print_optional_field(label: &str, value: Option<&str>) {
13
+ if let Some(value) = value {
14
+ print_field(label, value);
15
+ }
16
+ }
17
+
18
+ pub(crate) fn print_auth_apps(auth_apps: &[AuthApp]) {
19
+ print_heading("Auth apps");
20
+
21
+ if auth_apps.is_empty() {
22
+ println!("No Auth apps found.");
23
+ return;
24
+ }
25
+
26
+ for auth_app in auth_apps {
27
+ println!(
28
+ "#{} {} project={}",
29
+ auth_app.id,
30
+ style(&auth_app.name).bold(),
31
+ auth_app.project_id.as_deref().unwrap_or("-")
32
+ );
33
+ }
34
+ }
35
+
36
+ pub(crate) fn print_auth_app_detail(auth_app: &AuthApp) {
37
+ print_heading("Auth app");
38
+ print_field("ID", &auth_app.id);
39
+ print_field("Name", &auth_app.name);
40
+ print_optional_field("Project ID", auth_app.project_id.as_deref());
41
+ print_optional_field("Support email", auth_app.support_email.as_deref());
42
+ print_optional_field("Secret", auth_app.secret.as_deref());
43
+ print_field("Created at", auth_app.created_at.to_rfc3339());
44
+ print_field("Updated at", auth_app.updated_at.to_rfc3339());
45
+ }
@@ -0,0 +1,28 @@
1
+ use {
2
+ smbcloud_network::environment::Environment,
3
+ smbcloud_networking::{smb_base_url_builder, smb_client::SmbClient},
4
+ };
5
+
6
+ pub(crate) fn build_auth_apps_url(
7
+ env: Environment,
8
+ client: (&SmbClient, &str),
9
+ project_id: Option<&str>,
10
+ ) -> String {
11
+ let mut url_builder = smb_base_url_builder(env, client);
12
+ url_builder.add_route("v1/auth_apps");
13
+ if let Some(project_id) = project_id {
14
+ url_builder.add_param("project_id", project_id);
15
+ }
16
+ url_builder.build()
17
+ }
18
+
19
+ pub(crate) fn build_auth_app_url(
20
+ env: Environment,
21
+ client: (&SmbClient, &str),
22
+ auth_app_id: &str,
23
+ ) -> String {
24
+ let mut url_builder = smb_base_url_builder(env, client);
25
+ url_builder.add_route("v1/auth_apps");
26
+ url_builder.add_route(auth_app_id);
27
+ url_builder.build()
28
+ }
@@ -178,6 +178,7 @@ fn build_payload(
178
178
  fn strip_project(project: &Project) -> Project {
179
179
  Project {
180
180
  id: project.id,
181
+ tenant_id: project.tenant_id,
181
182
  name: project.name.clone(),
182
183
  runner: project.runner,
183
184
  deployment_method: DeploymentMethod::default(),
@@ -111,11 +111,13 @@ pub(crate) async fn create_new_project(
111
111
  }
112
112
  };
113
113
 
114
+ let tenant_id = crate::session_config::current_tenant_id(env).unwrap_or(None);
114
115
  let project = create_project(
115
116
  env,
116
117
  client(),
117
118
  access_token.clone(),
118
119
  ProjectCreate { name, description },
120
+ tenant_id,
119
121
  )
120
122
  .await?;
121
123
 
@@ -0,0 +1,24 @@
1
+ use anyhow::{anyhow, Result};
2
+ use smbcloud_network::environment::Environment;
3
+
4
+ pub(crate) fn resolve_optional_project_id(
5
+ env: Environment,
6
+ project_id: Option<String>,
7
+ ) -> Result<Option<String>> {
8
+ match project_id {
9
+ Some(project_id) => Ok(Some(project_id)),
10
+ None => crate::session_config::current_project_id(env),
11
+ }
12
+ }
13
+
14
+ pub(crate) fn resolve_required_project_id(
15
+ env: Environment,
16
+ project_id: Option<String>,
17
+ ) -> Result<String> {
18
+ match resolve_optional_project_id(env, project_id)? {
19
+ Some(project_id) => Ok(project_id),
20
+ None => Err(anyhow!(
21
+ "No project selected. Pass `--project-id` or run `smb project use --id <project-id>`."
22
+ )),
23
+ }
24
+ }
@@ -1,4 +1,4 @@
1
1
  pub mod cli;
2
- mod current_project;
2
+ pub(crate) mod current_project;
3
3
  pub mod process;
4
4
  mod render;
@@ -3,11 +3,17 @@ use smbcloud_networking::smb_client::SmbClient;
3
3
  pub mod account;
4
4
  pub mod ci;
5
5
  pub mod cli;
6
+ #[path = "cloud-auth/mod.rs"]
7
+ pub mod cloud_auth;
8
+ #[path = "cloud-deploy/mod.rs"]
6
9
  pub mod deploy;
7
10
  pub mod interface;
11
+ #[path = "cloud-mail/mod.rs"]
8
12
  pub mod mail;
9
13
  pub mod mcp;
10
14
  pub mod project;
15
+ mod session_config;
16
+ pub mod tenant;
11
17
  mod token;
12
18
  pub mod ui;
13
19