update_work_properties.rs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //! Example for updating an availability status.
  2. #![expect(unused_crate_dependencies, reason = "Example triggered false positive")]
  3. use clap::{Args, Parser};
  4. use libthreema::{
  5. cli::{MinimalIdentityConfig, MinimalIdentityConfigOptions},
  6. https::cli::https_client_builder,
  7. protobuf,
  8. utils::logging::init_stderr_logging,
  9. work::properties::{
  10. WorkAvailabilityStatus, WorkProperties, WorkPropertiesUpdateContext, WorkPropertiesUpdateLoop,
  11. WorkPropertiesUpdateResponse, WorkPropertiesUpdateTask,
  12. },
  13. };
  14. use tracing::Level;
  15. #[derive(Clone, Debug, Args)]
  16. struct WorkAvailabilityStatusOptions {
  17. #[arg(long)]
  18. category: protobuf::d2d_sync::WorkAvailabilityStatusCategory,
  19. #[arg(long, requires = "category")]
  20. description: Option<String>,
  21. }
  22. #[derive(Args)]
  23. struct WorkPropertiesOptions {
  24. #[command(flatten)]
  25. availability_status: WorkAvailabilityStatusOptions,
  26. }
  27. impl From<WorkPropertiesOptions> for WorkProperties {
  28. fn from(properties: WorkPropertiesOptions) -> WorkProperties {
  29. Self {
  30. availability_status: Some(WorkAvailabilityStatus {
  31. category: properties.availability_status.category,
  32. description: properties.availability_status.description,
  33. }),
  34. }
  35. }
  36. }
  37. #[derive(Parser)]
  38. #[command()]
  39. struct AvailabilityStatusCommand {
  40. #[command(flatten)]
  41. config: MinimalIdentityConfigOptions,
  42. #[command(flatten)]
  43. work_properties: WorkPropertiesOptions,
  44. }
  45. async fn run_set_availability_status(
  46. http_client: reqwest::Client,
  47. context: WorkPropertiesUpdateContext,
  48. work_properties: WorkProperties,
  49. ) -> anyhow::Result<()> {
  50. let mut task = WorkPropertiesUpdateTask::new(context, work_properties);
  51. loop {
  52. match task.poll()? {
  53. WorkPropertiesUpdateLoop::Instruction(instruction) => {
  54. let result = instruction.request.send(&http_client).await;
  55. task.response(WorkPropertiesUpdateResponse { result })?;
  56. },
  57. WorkPropertiesUpdateLoop::Done(()) => return Ok(()),
  58. }
  59. }
  60. }
  61. #[tokio::main]
  62. async fn main() -> anyhow::Result<()> {
  63. // Configure logging.
  64. init_stderr_logging(Level::DEBUG);
  65. // Create HTTP client.
  66. let http_client = https_client_builder().build()?;
  67. // Parse arguments for command.
  68. let arguments = AvailabilityStatusCommand::parse();
  69. let config = MinimalIdentityConfig::from_options(&http_client, arguments.config).await?;
  70. // Update the availability status.
  71. run_set_availability_status(
  72. http_client,
  73. config.work_properties_update_context()?,
  74. arguments.work_properties.into(),
  75. )
  76. .await?;
  77. Ok(())
  78. }