1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use xwt_core::prelude::*;

pub async fn connect<Endpoint>(
    endpoint: &Endpoint,
    url: &str,
) -> Result<ConnectSessionFor<Endpoint>, xwt_error::Connect<Endpoint>>
where
    Endpoint: xwt_core::endpoint::Connect,
{
    let connecting = endpoint
        .connect(url)
        .await
        .map_err(xwt_error::Connect::Connect)?;

    let session = connecting
        .wait_connect()
        .await
        .map_err(xwt_error::Connect::Connecting)?;

    Ok(session)
}

pub async fn ok_accepting<Accepting>(
    accepting: Accepting,
) -> Result<AcceptingSessionFor<Accepting>, xwt_error::Accepting<Accepting>>
where
    Accepting: xwt_core::endpoint::accept::Accepting,
    AcceptingSessionFor<Accepting>: xwt_core::base::Session,
{
    let request = accepting
        .wait_accept()
        .await
        .map_err(xwt_error::Accepting::Accepting)?;

    let session = request
        .ok()
        .await
        .map_err(xwt_error::Accepting::RequestOk)?;

    Ok(session)
}

pub async fn open_bi<Session>(
    session: &Session,
) -> Result<BiStreamsFor<Session>, xwt_error::OpenBi<Session>>
where
    Session: xwt_core::session::stream::OpenBi,
{
    let opening = session.open_bi().await.map_err(xwt_error::OpenBi::Open)?;
    let streams = opening
        .wait_bi()
        .await
        .map_err(xwt_error::OpenBi::Opening)?;

    Ok(streams)
}

pub async fn open_uni<Session>(
    session: &Session,
) -> Result<SendUniStreamFor<Session>, xwt_error::OpenUni<Session>>
where
    Session: xwt_core::session::stream::OpenUni,
{
    let opening = session.open_uni().await.map_err(xwt_error::OpenUni::Open)?;
    let stream = opening
        .wait_uni()
        .await
        .map_err(xwt_error::OpenUni::Opening)?;

    Ok(stream)
}