ydb 0.10.2

Crate contains generated low-level grpc code from YDB API protobuf, used as base for ydb crate
Documentation
use std::sync::Arc;
use tracing::trace;

use tokio_util::sync::CancellationToken;

use crate::{
    grpc_wrapper::raw_coordination_service::session::release_semaphore::{
        RawReleaseSemaphoreRequest, RawReleaseSemaphoreResult,
    },
    YdbResult,
};

use super::controller::RequestController;

#[allow(dead_code)]
pub struct Lease {
    release_channel: Arc<RequestController<RawReleaseSemaphoreResult>>,
    semaphore_name: String,
    cancellation_token: CancellationToken,
}

#[allow(dead_code)]
impl Lease {
    pub(crate) fn new(
        release_channel: Arc<RequestController<RawReleaseSemaphoreResult>>,
        semaphore_name: String,
        cancellation_token: CancellationToken,
    ) -> Lease {
        Lease {
            release_channel,
            semaphore_name,
            cancellation_token,
        }
    }

    pub fn alive(&self) -> CancellationToken {
        self.cancellation_token.clone()
    }

    pub fn release(self) {
        tokio::spawn(Lease::release_impl(
            self.semaphore_name.clone(),
            self.cancellation_token.clone(),
            self.release_channel.clone(),
        ));
    }

    async fn release_impl(
        semaphore_name: String,
        cancellation_token: CancellationToken,
        release_channel: Arc<RequestController<RawReleaseSemaphoreResult>>,
    ) -> YdbResult<()> {
        cancellation_token.cancel();
        trace!("releaseing semaphore {}", semaphore_name);
        let mut rx = release_channel
            .send(RawReleaseSemaphoreRequest::new(semaphore_name.clone()))
            .await?;

        let result = rx.recv().await;
        if let Some(answer) = result {
            if answer.released {
                trace!("semaphore {} released", semaphore_name);
            }
        }
        Ok(())
    }
}

impl Drop for Lease {
    fn drop(&mut self) {
        tokio::spawn(Lease::release_impl(
            self.semaphore_name.clone(),
            self.cancellation_token.clone(),
            self.release_channel.clone(),
        ));
    }
}