ConnectionBuilder

Struct ConnectionBuilder 

Source
pub struct ConnectionBuilder { /* private fields */ }
Expand description

Строитель для создания и настройки экземпляров Connection.

ConnectionBuilder предоставляет удобный интерфейс для настройки параметров соединения перед установлением соединения с сервером CloudPub.

§Пример

use cloudpub_sdk::Connection;
use std::time::Duration;

let conn = Connection::builder()
    .config_path("/custom/config.toml")  // Пользовательский файл конфигурации
    .log_level("debug")                  // Установка уровня логирования
    .verbose(true)                       // Включить вывод в консоль
    .credentials("user@example.com", "password")  // Учетные данные для аутентификации
    .timeout(Duration::from_secs(30))    // Таймаут операций
    .build()
    .await?;

§Методы аутентификации

Строитель поддерживает два метода аутентификации:

  1. На основе токена: Используйте token() для аутентификации с существующим токеном
  2. Учетные данные: Используйте credentials() или email()/password() для аутентификации по имени/паролю

§Значения по умолчанию

  • Уровень логирования: “info”
  • Подробный вывод: false
  • Таймаут: 10 секунд
  • Путь к конфигурации: Системное расположение по умолчанию (~/.config/cloudpub/client.toml)

Implementations§

Source§

impl ConnectionBuilder

Source

pub fn new() -> Self

Создает новый builder с настройками по умолчанию.

§Пример
use cloudpub_sdk::ConnectionBuilder;

let builder = ConnectionBuilder::new();
Source

pub fn config_path<P: AsRef<Path>>(self, path: P) -> Self

Устанавливает путь к файлу конфигурации.

По умолчанию SDK ищет файл конфигурации в стандартном системном расположении. Используйте этот метод для указания пользовательского расположения.

§Аргументы
  • path - Путь к файлу конфигурации
§Пример
use cloudpub_sdk::Connection;
use std::path::Path;

let conn = Connection::builder()
    .config_path(Path::new("/etc/cloudpub/config.toml"))
    .build()
    .await?;
Examples found in repository?
examples/example.rs (line 36)
25async fn main() -> Result<()> {
26    // ====================================================================
27    // ШАГ 1: УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ
28    // ====================================================================
29    println!("1. Подключение к серверу");
30
31    // Создание соединения с использованием паттерна билдера
32    // Билдер позволяет настроить различные параметры соединения
33    let mut conn = Connection::builder()
34        // Указать путь к пользовательскому файлу конфигурации (опционально)
35        // Если не указан, используется системное расположение по умолчанию
36        .config_path(Path::new("/tmp/cloudpub.toml"))
37        // Установить уровень логирования для отладки
38        // Варианты: "trace", "debug", "info", "warn", "error"
39        .log_level("info")
40        // Включить подробный вывод в stderr для отладки
41        // Полезно при разработке, отключите в продакшене
42        .verbose(true)
43        // Предоставить учетные данные для аутентификации
44        // Вы также можете использовать .token() для аутентификации на основе токена
45        .credentials("admin@example.com", "test")
46        // Установить таймаут для операций (в секундах)
47        // Применяется ко всем асинхронным операциям
48        .timeout_secs(3)
49        // Построить и установить соединение
50        // Произойдет аутентификация и ожидание готовности соединения
51        .build()
52        .await?;
53
54    // ====================================================================
55    // ШАГ 2: ПУБЛИКАЦИЯ HTTP СЕРВИСА
56    // ====================================================================
57    println!("2. Публикация нового HTTP сервиса...");
58
59    // Публикация локального HTTP сервиса для доступа через CloudPub
60    let endpoint = conn
61        .publish(
62            Protocol::Http,                           // Тип протокола
63            "localhost:8080".to_string(),             // Локальный адрес для публикации
64            Some("Тестовый HTTP сервис".to_string()), // Человекочитаемое имя сервиса
65            Some(Auth::None),                         // Метод аутентификации для доступа к сервису
66            None,                                     // Без ограничений ACL
67            None,                                     // Без пользовательских заголовков
68            None,                                     // Без правил фильтрации
69        )
70        .await?;
71
72    // Endpoint содержит информацию об опубликованном сервисе
73    // as_url() возвращает публичный URL, по которому доступен сервис
74    println!("  Сервис опубликован: {}", endpoint.as_url());
75
76    // ====================================================================
77    // ШАГ 3: ПУБЛИКАЦИЯ TCP СЕРВИСА
78    // ====================================================================
79    println!("3. Публикация нового TCP сервиса...");
80
81    // TCP сервисы полезны для публикации SSH, баз данных или пользовательских TCP протоколов
82    let endpoint = conn
83        .publish(
84            Protocol::Tcp,                           // TCP протокол
85            "localhost:22".to_string(),              // Локальный SSH порт (пример)
86            Some("Тестовый TCP сервис".to_string()), // Имя сервиса
87            Some(Auth::None),                        // Аутентификация не требуется
88            None,                                    // Без ограничений ACL
89            None,                                    // Без пользовательских заголовков
90            None,                                    // Без правил фильтрации
91        )
92        .await?;
93
94    println!("  Сервис опубликован: {}", endpoint.as_url());
95
96    // Сохранить GUID для последующих операций
97    // GUID уникально идентифицирует этот сервис
98    let service_guid = endpoint.guid.clone();
99
100    // ====================================================================
101    // ШАГ 4: СПИСОК ВСЕХ СЕРВИСОВ
102    // ====================================================================
103    println!("4. Список сервисов:");
104
105    // Получить все сервисы, зарегистрированные текущим пользователем
106    let services = conn.ls().await?;
107
108    // Отобразить каждый сервис с его GUID и URL
109    for service in &services {
110        println!("  {}: {}", service.guid, service.as_url());
111
112        // Сервисы также содержат дополнительные метаданные:
113        // - service.name: Опциональное человекочитаемое имя
114        // - service.status: Текущий статус (работает, остановлен и т.д.)
115        // - service.protocol: Тип протокола
116        // - service.auth: Метод аутентификации
117    }
118
119    // ====================================================================
120    // ШАГ 5: ЗАПУСК СЕРВИСА
121    // ====================================================================
122    println!("5. Запуск сервиса {}...", service_guid);
123
124    // Запустить ранее остановленный сервис
125    // Примечание: Сервисы обычно запускаются автоматически после публикации
126    conn.start(service_guid.clone()).await?;
127    println!("   - Сервис запущен");
128
129    // ====================================================================
130    // ШАГ 6: ПРОВЕРКА СТАТУСА СЕРВИСА
131    // ====================================================================
132    println!("6. Проверка статуса сервиса...");
133
134    // Получить список сервисов снова, чтобы увидеть обновленный статус
135    let services = conn.ls().await?;
136
137    // Найти наш конкретный сервис и отобразить его статус
138    if let Some(service) = services.iter().find(|s| s.guid == service_guid) {
139        println!(
140            "   - Статус сервиса: {}",
141            service.status.as_ref().unwrap_or(&"Неизвестно".to_string())
142        );
143
144        // Поле статуса указывает состояние сервиса:
145        // - "running": Сервис активен и доступен
146        // - "stopped": Сервис зарегистрирован, но не доступен
147        // - "error": Сервис столкнулся с ошибкой
148    }
149
150    let mut buffer = String::new();
151    io::stdin()
152        .read_line(&mut buffer)
153        .expect("Не удалось прочитать строку");
154
155    // ====================================================================
156    // ШАГ 7: ОСТАНОВКА СЕРВИСА
157    // ====================================================================
158    println!("7. Остановка сервиса {}...", service_guid);
159
160    // Остановка делает сервис временно недоступным,
161    // но сохраняет его регистрацию
162    conn.stop(service_guid.clone()).await?;
163    println!("   - Сервис остановлен");
164
165    // ====================================================================
166    // ШАГ 8: ОТМЕНА ПУБЛИКАЦИИ СЕРВИСА
167    // ====================================================================
168    println!("8. Отмена регистрации сервиса {}...", service_guid);
169
170    // Отмена публикации удаляет регистрацию сервиса
171    // Сервис больше не будет доступен через CloudPub
172    conn.unpublish(service_guid.clone()).await?;
173    println!("   - Регистрация сервиса отменена");
174
175    // ====================================================================
176    // ШАГ 9: ПРОВЕРКА УДАЛЕНИЯ
177    // ====================================================================
178    println!("9. Финальный список сервисов...");
179
180    // Получить список сервисов для подтверждения удаления
181    let services = conn.ls().await?;
182    println!("   - Осталось {} сервис(ов)", services.len());
183
184    // ====================================================================
185    // ШАГ 10: ОЧИСТКА ВСЕХ СЕРВИСОВ
186    // ====================================================================
187    println!("10. Очистка всех сервисов...");
188
189    // Clean удаляет все сервисы, зарегистрированные текущим пользователем
190    // Используйте с осторожностью, так как это действие нельзя отменить
191    conn.clean().await?;
192    println!("   - Все сервисы удалены");
193
194    // Проверить, что все сервисы были удалены
195    let services = conn.ls().await?;
196    println!("   Финальное количество: {} сервис(ов)", services.len());
197
198    println!("Демонстрация успешно завершена!");
199
200    // ====================================================================
201    // ОЧИСТКА СОЕДИНЕНИЯ
202    // ====================================================================
203    // Соединение будет автоматически закрыто, когда `conn` выйдет из области видимости
204    // Реализация Drop обрабатывает:
205    // - Отправку сообщения Break для корректной остановки клиента
206    // - Отмену фоновых задач
207    // - Очистку ресурсов
208
209    Ok(())
210}
Source

pub fn log_level<S: Into<String>>(self, level: S) -> Self

Устанавливает уровень логирования для SDK.

§Аргументы
  • level - Уровень логирования: “trace”, “debug”, “info”, “warn”, “error”
§Пример
use cloudpub_sdk::Connection;

// Включить отладочное логирование
let conn = Connection::builder()
    .log_level("debug")
    .verbose(true)  // Также выводить в консоль
    .build()
    .await?;
Examples found in repository?
examples/example.rs (line 39)
25async fn main() -> Result<()> {
26    // ====================================================================
27    // ШАГ 1: УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ
28    // ====================================================================
29    println!("1. Подключение к серверу");
30
31    // Создание соединения с использованием паттерна билдера
32    // Билдер позволяет настроить различные параметры соединения
33    let mut conn = Connection::builder()
34        // Указать путь к пользовательскому файлу конфигурации (опционально)
35        // Если не указан, используется системное расположение по умолчанию
36        .config_path(Path::new("/tmp/cloudpub.toml"))
37        // Установить уровень логирования для отладки
38        // Варианты: "trace", "debug", "info", "warn", "error"
39        .log_level("info")
40        // Включить подробный вывод в stderr для отладки
41        // Полезно при разработке, отключите в продакшене
42        .verbose(true)
43        // Предоставить учетные данные для аутентификации
44        // Вы также можете использовать .token() для аутентификации на основе токена
45        .credentials("admin@example.com", "test")
46        // Установить таймаут для операций (в секундах)
47        // Применяется ко всем асинхронным операциям
48        .timeout_secs(3)
49        // Построить и установить соединение
50        // Произойдет аутентификация и ожидание готовности соединения
51        .build()
52        .await?;
53
54    // ====================================================================
55    // ШАГ 2: ПУБЛИКАЦИЯ HTTP СЕРВИСА
56    // ====================================================================
57    println!("2. Публикация нового HTTP сервиса...");
58
59    // Публикация локального HTTP сервиса для доступа через CloudPub
60    let endpoint = conn
61        .publish(
62            Protocol::Http,                           // Тип протокола
63            "localhost:8080".to_string(),             // Локальный адрес для публикации
64            Some("Тестовый HTTP сервис".to_string()), // Человекочитаемое имя сервиса
65            Some(Auth::None),                         // Метод аутентификации для доступа к сервису
66            None,                                     // Без ограничений ACL
67            None,                                     // Без пользовательских заголовков
68            None,                                     // Без правил фильтрации
69        )
70        .await?;
71
72    // Endpoint содержит информацию об опубликованном сервисе
73    // as_url() возвращает публичный URL, по которому доступен сервис
74    println!("  Сервис опубликован: {}", endpoint.as_url());
75
76    // ====================================================================
77    // ШАГ 3: ПУБЛИКАЦИЯ TCP СЕРВИСА
78    // ====================================================================
79    println!("3. Публикация нового TCP сервиса...");
80
81    // TCP сервисы полезны для публикации SSH, баз данных или пользовательских TCP протоколов
82    let endpoint = conn
83        .publish(
84            Protocol::Tcp,                           // TCP протокол
85            "localhost:22".to_string(),              // Локальный SSH порт (пример)
86            Some("Тестовый TCP сервис".to_string()), // Имя сервиса
87            Some(Auth::None),                        // Аутентификация не требуется
88            None,                                    // Без ограничений ACL
89            None,                                    // Без пользовательских заголовков
90            None,                                    // Без правил фильтрации
91        )
92        .await?;
93
94    println!("  Сервис опубликован: {}", endpoint.as_url());
95
96    // Сохранить GUID для последующих операций
97    // GUID уникально идентифицирует этот сервис
98    let service_guid = endpoint.guid.clone();
99
100    // ====================================================================
101    // ШАГ 4: СПИСОК ВСЕХ СЕРВИСОВ
102    // ====================================================================
103    println!("4. Список сервисов:");
104
105    // Получить все сервисы, зарегистрированные текущим пользователем
106    let services = conn.ls().await?;
107
108    // Отобразить каждый сервис с его GUID и URL
109    for service in &services {
110        println!("  {}: {}", service.guid, service.as_url());
111
112        // Сервисы также содержат дополнительные метаданные:
113        // - service.name: Опциональное человекочитаемое имя
114        // - service.status: Текущий статус (работает, остановлен и т.д.)
115        // - service.protocol: Тип протокола
116        // - service.auth: Метод аутентификации
117    }
118
119    // ====================================================================
120    // ШАГ 5: ЗАПУСК СЕРВИСА
121    // ====================================================================
122    println!("5. Запуск сервиса {}...", service_guid);
123
124    // Запустить ранее остановленный сервис
125    // Примечание: Сервисы обычно запускаются автоматически после публикации
126    conn.start(service_guid.clone()).await?;
127    println!("   - Сервис запущен");
128
129    // ====================================================================
130    // ШАГ 6: ПРОВЕРКА СТАТУСА СЕРВИСА
131    // ====================================================================
132    println!("6. Проверка статуса сервиса...");
133
134    // Получить список сервисов снова, чтобы увидеть обновленный статус
135    let services = conn.ls().await?;
136
137    // Найти наш конкретный сервис и отобразить его статус
138    if let Some(service) = services.iter().find(|s| s.guid == service_guid) {
139        println!(
140            "   - Статус сервиса: {}",
141            service.status.as_ref().unwrap_or(&"Неизвестно".to_string())
142        );
143
144        // Поле статуса указывает состояние сервиса:
145        // - "running": Сервис активен и доступен
146        // - "stopped": Сервис зарегистрирован, но не доступен
147        // - "error": Сервис столкнулся с ошибкой
148    }
149
150    let mut buffer = String::new();
151    io::stdin()
152        .read_line(&mut buffer)
153        .expect("Не удалось прочитать строку");
154
155    // ====================================================================
156    // ШАГ 7: ОСТАНОВКА СЕРВИСА
157    // ====================================================================
158    println!("7. Остановка сервиса {}...", service_guid);
159
160    // Остановка делает сервис временно недоступным,
161    // но сохраняет его регистрацию
162    conn.stop(service_guid.clone()).await?;
163    println!("   - Сервис остановлен");
164
165    // ====================================================================
166    // ШАГ 8: ОТМЕНА ПУБЛИКАЦИИ СЕРВИСА
167    // ====================================================================
168    println!("8. Отмена регистрации сервиса {}...", service_guid);
169
170    // Отмена публикации удаляет регистрацию сервиса
171    // Сервис больше не будет доступен через CloudPub
172    conn.unpublish(service_guid.clone()).await?;
173    println!("   - Регистрация сервиса отменена");
174
175    // ====================================================================
176    // ШАГ 9: ПРОВЕРКА УДАЛЕНИЯ
177    // ====================================================================
178    println!("9. Финальный список сервисов...");
179
180    // Получить список сервисов для подтверждения удаления
181    let services = conn.ls().await?;
182    println!("   - Осталось {} сервис(ов)", services.len());
183
184    // ====================================================================
185    // ШАГ 10: ОЧИСТКА ВСЕХ СЕРВИСОВ
186    // ====================================================================
187    println!("10. Очистка всех сервисов...");
188
189    // Clean удаляет все сервисы, зарегистрированные текущим пользователем
190    // Используйте с осторожностью, так как это действие нельзя отменить
191    conn.clean().await?;
192    println!("   - Все сервисы удалены");
193
194    // Проверить, что все сервисы были удалены
195    let services = conn.ls().await?;
196    println!("   Финальное количество: {} сервис(ов)", services.len());
197
198    println!("Демонстрация успешно завершена!");
199
200    // ====================================================================
201    // ОЧИСТКА СОЕДИНЕНИЯ
202    // ====================================================================
203    // Соединение будет автоматически закрыто, когда `conn` выйдет из области видимости
204    // Реализация Drop обрабатывает:
205    // - Отправку сообщения Break для корректной остановки клиента
206    // - Отмену фоновых задач
207    // - Очистку ресурсов
208
209    Ok(())
210}
Source

pub fn verbose(self, verbose: bool) -> Self

Включает или отключает подробное логирование в консоль.

При включении сообщения логов выводятся в stderr в дополнение к файлу логов. Это полезно для отладки и разработки.

§Аргументы
  • verbose - true для включения вывода в консоль, false для отключения
§Пример
use cloudpub_sdk::Connection;

let conn = Connection::builder()
    .verbose(true)  // Включить вывод в консоль
    .build()
    .await?;
Examples found in repository?
examples/example.rs (line 42)
25async fn main() -> Result<()> {
26    // ====================================================================
27    // ШАГ 1: УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ
28    // ====================================================================
29    println!("1. Подключение к серверу");
30
31    // Создание соединения с использованием паттерна билдера
32    // Билдер позволяет настроить различные параметры соединения
33    let mut conn = Connection::builder()
34        // Указать путь к пользовательскому файлу конфигурации (опционально)
35        // Если не указан, используется системное расположение по умолчанию
36        .config_path(Path::new("/tmp/cloudpub.toml"))
37        // Установить уровень логирования для отладки
38        // Варианты: "trace", "debug", "info", "warn", "error"
39        .log_level("info")
40        // Включить подробный вывод в stderr для отладки
41        // Полезно при разработке, отключите в продакшене
42        .verbose(true)
43        // Предоставить учетные данные для аутентификации
44        // Вы также можете использовать .token() для аутентификации на основе токена
45        .credentials("admin@example.com", "test")
46        // Установить таймаут для операций (в секундах)
47        // Применяется ко всем асинхронным операциям
48        .timeout_secs(3)
49        // Построить и установить соединение
50        // Произойдет аутентификация и ожидание готовности соединения
51        .build()
52        .await?;
53
54    // ====================================================================
55    // ШАГ 2: ПУБЛИКАЦИЯ HTTP СЕРВИСА
56    // ====================================================================
57    println!("2. Публикация нового HTTP сервиса...");
58
59    // Публикация локального HTTP сервиса для доступа через CloudPub
60    let endpoint = conn
61        .publish(
62            Protocol::Http,                           // Тип протокола
63            "localhost:8080".to_string(),             // Локальный адрес для публикации
64            Some("Тестовый HTTP сервис".to_string()), // Человекочитаемое имя сервиса
65            Some(Auth::None),                         // Метод аутентификации для доступа к сервису
66            None,                                     // Без ограничений ACL
67            None,                                     // Без пользовательских заголовков
68            None,                                     // Без правил фильтрации
69        )
70        .await?;
71
72    // Endpoint содержит информацию об опубликованном сервисе
73    // as_url() возвращает публичный URL, по которому доступен сервис
74    println!("  Сервис опубликован: {}", endpoint.as_url());
75
76    // ====================================================================
77    // ШАГ 3: ПУБЛИКАЦИЯ TCP СЕРВИСА
78    // ====================================================================
79    println!("3. Публикация нового TCP сервиса...");
80
81    // TCP сервисы полезны для публикации SSH, баз данных или пользовательских TCP протоколов
82    let endpoint = conn
83        .publish(
84            Protocol::Tcp,                           // TCP протокол
85            "localhost:22".to_string(),              // Локальный SSH порт (пример)
86            Some("Тестовый TCP сервис".to_string()), // Имя сервиса
87            Some(Auth::None),                        // Аутентификация не требуется
88            None,                                    // Без ограничений ACL
89            None,                                    // Без пользовательских заголовков
90            None,                                    // Без правил фильтрации
91        )
92        .await?;
93
94    println!("  Сервис опубликован: {}", endpoint.as_url());
95
96    // Сохранить GUID для последующих операций
97    // GUID уникально идентифицирует этот сервис
98    let service_guid = endpoint.guid.clone();
99
100    // ====================================================================
101    // ШАГ 4: СПИСОК ВСЕХ СЕРВИСОВ
102    // ====================================================================
103    println!("4. Список сервисов:");
104
105    // Получить все сервисы, зарегистрированные текущим пользователем
106    let services = conn.ls().await?;
107
108    // Отобразить каждый сервис с его GUID и URL
109    for service in &services {
110        println!("  {}: {}", service.guid, service.as_url());
111
112        // Сервисы также содержат дополнительные метаданные:
113        // - service.name: Опциональное человекочитаемое имя
114        // - service.status: Текущий статус (работает, остановлен и т.д.)
115        // - service.protocol: Тип протокола
116        // - service.auth: Метод аутентификации
117    }
118
119    // ====================================================================
120    // ШАГ 5: ЗАПУСК СЕРВИСА
121    // ====================================================================
122    println!("5. Запуск сервиса {}...", service_guid);
123
124    // Запустить ранее остановленный сервис
125    // Примечание: Сервисы обычно запускаются автоматически после публикации
126    conn.start(service_guid.clone()).await?;
127    println!("   - Сервис запущен");
128
129    // ====================================================================
130    // ШАГ 6: ПРОВЕРКА СТАТУСА СЕРВИСА
131    // ====================================================================
132    println!("6. Проверка статуса сервиса...");
133
134    // Получить список сервисов снова, чтобы увидеть обновленный статус
135    let services = conn.ls().await?;
136
137    // Найти наш конкретный сервис и отобразить его статус
138    if let Some(service) = services.iter().find(|s| s.guid == service_guid) {
139        println!(
140            "   - Статус сервиса: {}",
141            service.status.as_ref().unwrap_or(&"Неизвестно".to_string())
142        );
143
144        // Поле статуса указывает состояние сервиса:
145        // - "running": Сервис активен и доступен
146        // - "stopped": Сервис зарегистрирован, но не доступен
147        // - "error": Сервис столкнулся с ошибкой
148    }
149
150    let mut buffer = String::new();
151    io::stdin()
152        .read_line(&mut buffer)
153        .expect("Не удалось прочитать строку");
154
155    // ====================================================================
156    // ШАГ 7: ОСТАНОВКА СЕРВИСА
157    // ====================================================================
158    println!("7. Остановка сервиса {}...", service_guid);
159
160    // Остановка делает сервис временно недоступным,
161    // но сохраняет его регистрацию
162    conn.stop(service_guid.clone()).await?;
163    println!("   - Сервис остановлен");
164
165    // ====================================================================
166    // ШАГ 8: ОТМЕНА ПУБЛИКАЦИИ СЕРВИСА
167    // ====================================================================
168    println!("8. Отмена регистрации сервиса {}...", service_guid);
169
170    // Отмена публикации удаляет регистрацию сервиса
171    // Сервис больше не будет доступен через CloudPub
172    conn.unpublish(service_guid.clone()).await?;
173    println!("   - Регистрация сервиса отменена");
174
175    // ====================================================================
176    // ШАГ 9: ПРОВЕРКА УДАЛЕНИЯ
177    // ====================================================================
178    println!("9. Финальный список сервисов...");
179
180    // Получить список сервисов для подтверждения удаления
181    let services = conn.ls().await?;
182    println!("   - Осталось {} сервис(ов)", services.len());
183
184    // ====================================================================
185    // ШАГ 10: ОЧИСТКА ВСЕХ СЕРВИСОВ
186    // ====================================================================
187    println!("10. Очистка всех сервисов...");
188
189    // Clean удаляет все сервисы, зарегистрированные текущим пользователем
190    // Используйте с осторожностью, так как это действие нельзя отменить
191    conn.clean().await?;
192    println!("   - Все сервисы удалены");
193
194    // Проверить, что все сервисы были удалены
195    let services = conn.ls().await?;
196    println!("   Финальное количество: {} сервис(ов)", services.len());
197
198    println!("Демонстрация успешно завершена!");
199
200    // ====================================================================
201    // ОЧИСТКА СОЕДИНЕНИЯ
202    // ====================================================================
203    // Соединение будет автоматически закрыто, когда `conn` выйдет из области видимости
204    // Реализация Drop обрабатывает:
205    // - Отправку сообщения Break для корректной остановки клиента
206    // - Отмену фоновых задач
207    // - Очистку ресурсов
208
209    Ok(())
210}
Source

pub fn token<S: Into<String>>(self, token: S) -> Self

Устанавливает токен аутентификации.

Используйте этот метод для аутентификации на основе токена. Это взаимоисключающе с аутентификацией на основе учетных данных.

§Аргументы
  • token - Токен аутентификации, полученный при предыдущем входе
§Пример
use cloudpub_sdk::Connection;

let conn = Connection::builder()
    .token("your-auth-token-here")
    .build()
    .await?;
Source

pub fn credentials<S: Into<String>>(self, email: S, password: S) -> Self

Устанавливает email и пароль для аутентификации.

Используйте этот метод для аутентификации на основе учетных данных. Это взаимоисключающе с аутентификацией на основе токена.

§Аргументы
  • email - Email адрес пользователя
  • password - Пароль пользователя
§Пример
use cloudpub_sdk::Connection;

let conn = Connection::builder()
    .credentials("user@example.com", "secure-password")
    .build()
    .await?;
Examples found in repository?
examples/example.rs (line 45)
25async fn main() -> Result<()> {
26    // ====================================================================
27    // ШАГ 1: УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ
28    // ====================================================================
29    println!("1. Подключение к серверу");
30
31    // Создание соединения с использованием паттерна билдера
32    // Билдер позволяет настроить различные параметры соединения
33    let mut conn = Connection::builder()
34        // Указать путь к пользовательскому файлу конфигурации (опционально)
35        // Если не указан, используется системное расположение по умолчанию
36        .config_path(Path::new("/tmp/cloudpub.toml"))
37        // Установить уровень логирования для отладки
38        // Варианты: "trace", "debug", "info", "warn", "error"
39        .log_level("info")
40        // Включить подробный вывод в stderr для отладки
41        // Полезно при разработке, отключите в продакшене
42        .verbose(true)
43        // Предоставить учетные данные для аутентификации
44        // Вы также можете использовать .token() для аутентификации на основе токена
45        .credentials("admin@example.com", "test")
46        // Установить таймаут для операций (в секундах)
47        // Применяется ко всем асинхронным операциям
48        .timeout_secs(3)
49        // Построить и установить соединение
50        // Произойдет аутентификация и ожидание готовности соединения
51        .build()
52        .await?;
53
54    // ====================================================================
55    // ШАГ 2: ПУБЛИКАЦИЯ HTTP СЕРВИСА
56    // ====================================================================
57    println!("2. Публикация нового HTTP сервиса...");
58
59    // Публикация локального HTTP сервиса для доступа через CloudPub
60    let endpoint = conn
61        .publish(
62            Protocol::Http,                           // Тип протокола
63            "localhost:8080".to_string(),             // Локальный адрес для публикации
64            Some("Тестовый HTTP сервис".to_string()), // Человекочитаемое имя сервиса
65            Some(Auth::None),                         // Метод аутентификации для доступа к сервису
66            None,                                     // Без ограничений ACL
67            None,                                     // Без пользовательских заголовков
68            None,                                     // Без правил фильтрации
69        )
70        .await?;
71
72    // Endpoint содержит информацию об опубликованном сервисе
73    // as_url() возвращает публичный URL, по которому доступен сервис
74    println!("  Сервис опубликован: {}", endpoint.as_url());
75
76    // ====================================================================
77    // ШАГ 3: ПУБЛИКАЦИЯ TCP СЕРВИСА
78    // ====================================================================
79    println!("3. Публикация нового TCP сервиса...");
80
81    // TCP сервисы полезны для публикации SSH, баз данных или пользовательских TCP протоколов
82    let endpoint = conn
83        .publish(
84            Protocol::Tcp,                           // TCP протокол
85            "localhost:22".to_string(),              // Локальный SSH порт (пример)
86            Some("Тестовый TCP сервис".to_string()), // Имя сервиса
87            Some(Auth::None),                        // Аутентификация не требуется
88            None,                                    // Без ограничений ACL
89            None,                                    // Без пользовательских заголовков
90            None,                                    // Без правил фильтрации
91        )
92        .await?;
93
94    println!("  Сервис опубликован: {}", endpoint.as_url());
95
96    // Сохранить GUID для последующих операций
97    // GUID уникально идентифицирует этот сервис
98    let service_guid = endpoint.guid.clone();
99
100    // ====================================================================
101    // ШАГ 4: СПИСОК ВСЕХ СЕРВИСОВ
102    // ====================================================================
103    println!("4. Список сервисов:");
104
105    // Получить все сервисы, зарегистрированные текущим пользователем
106    let services = conn.ls().await?;
107
108    // Отобразить каждый сервис с его GUID и URL
109    for service in &services {
110        println!("  {}: {}", service.guid, service.as_url());
111
112        // Сервисы также содержат дополнительные метаданные:
113        // - service.name: Опциональное человекочитаемое имя
114        // - service.status: Текущий статус (работает, остановлен и т.д.)
115        // - service.protocol: Тип протокола
116        // - service.auth: Метод аутентификации
117    }
118
119    // ====================================================================
120    // ШАГ 5: ЗАПУСК СЕРВИСА
121    // ====================================================================
122    println!("5. Запуск сервиса {}...", service_guid);
123
124    // Запустить ранее остановленный сервис
125    // Примечание: Сервисы обычно запускаются автоматически после публикации
126    conn.start(service_guid.clone()).await?;
127    println!("   - Сервис запущен");
128
129    // ====================================================================
130    // ШАГ 6: ПРОВЕРКА СТАТУСА СЕРВИСА
131    // ====================================================================
132    println!("6. Проверка статуса сервиса...");
133
134    // Получить список сервисов снова, чтобы увидеть обновленный статус
135    let services = conn.ls().await?;
136
137    // Найти наш конкретный сервис и отобразить его статус
138    if let Some(service) = services.iter().find(|s| s.guid == service_guid) {
139        println!(
140            "   - Статус сервиса: {}",
141            service.status.as_ref().unwrap_or(&"Неизвестно".to_string())
142        );
143
144        // Поле статуса указывает состояние сервиса:
145        // - "running": Сервис активен и доступен
146        // - "stopped": Сервис зарегистрирован, но не доступен
147        // - "error": Сервис столкнулся с ошибкой
148    }
149
150    let mut buffer = String::new();
151    io::stdin()
152        .read_line(&mut buffer)
153        .expect("Не удалось прочитать строку");
154
155    // ====================================================================
156    // ШАГ 7: ОСТАНОВКА СЕРВИСА
157    // ====================================================================
158    println!("7. Остановка сервиса {}...", service_guid);
159
160    // Остановка делает сервис временно недоступным,
161    // но сохраняет его регистрацию
162    conn.stop(service_guid.clone()).await?;
163    println!("   - Сервис остановлен");
164
165    // ====================================================================
166    // ШАГ 8: ОТМЕНА ПУБЛИКАЦИИ СЕРВИСА
167    // ====================================================================
168    println!("8. Отмена регистрации сервиса {}...", service_guid);
169
170    // Отмена публикации удаляет регистрацию сервиса
171    // Сервис больше не будет доступен через CloudPub
172    conn.unpublish(service_guid.clone()).await?;
173    println!("   - Регистрация сервиса отменена");
174
175    // ====================================================================
176    // ШАГ 9: ПРОВЕРКА УДАЛЕНИЯ
177    // ====================================================================
178    println!("9. Финальный список сервисов...");
179
180    // Получить список сервисов для подтверждения удаления
181    let services = conn.ls().await?;
182    println!("   - Осталось {} сервис(ов)", services.len());
183
184    // ====================================================================
185    // ШАГ 10: ОЧИСТКА ВСЕХ СЕРВИСОВ
186    // ====================================================================
187    println!("10. Очистка всех сервисов...");
188
189    // Clean удаляет все сервисы, зарегистрированные текущим пользователем
190    // Используйте с осторожностью, так как это действие нельзя отменить
191    conn.clean().await?;
192    println!("   - Все сервисы удалены");
193
194    // Проверить, что все сервисы были удалены
195    let services = conn.ls().await?;
196    println!("   Финальное количество: {} сервис(ов)", services.len());
197
198    println!("Демонстрация успешно завершена!");
199
200    // ====================================================================
201    // ОЧИСТКА СОЕДИНЕНИЯ
202    // ====================================================================
203    // Соединение будет автоматически закрыто, когда `conn` выйдет из области видимости
204    // Реализация Drop обрабатывает:
205    // - Отправку сообщения Break для корректной остановки клиента
206    // - Отмену фоновых задач
207    // - Очистку ресурсов
208
209    Ok(())
210}
Source

pub fn email<S: Into<String>>(self, email: S) -> Self

Устанавливает только email адрес.

Должен использоваться в сочетании с password(). Это полезно, когда учетные данные получаются отдельно.

§Аргументы
  • email - Email адрес пользователя
§Пример
use cloudpub_sdk::Connection;

let conn = Connection::builder()
    .email("user@example.com")
    .password("secure-password")
    .build()
    .await?;
Source

pub fn password<S: Into<String>>(self, password: S) -> Self

Устанавливает только пароль.

Должен использоваться в сочетании с email(). Это полезно, когда учетные данные получаются отдельно.

§Аргументы
  • password - Пароль пользователя
§Пример
use cloudpub_sdk::Connection;

let email = std::env::var("CLOUDPUB_EMAIL")?;
let password = std::env::var("CLOUDPUB_PASSWORD")?;

let conn = Connection::builder()
    .email(email)
    .password(password)
    .build()
    .await?;
Source

pub fn timeout(self, timeout: Duration) -> Self

Устанавливает таймаут для операций.

Этот таймаут применяется ко всем асинхронным операциям, таким как register, publish, ls и т.д. По умолчанию 10 секунд.

§Аргументы
  • timeout - Продолжительность таймаута операции
§Пример
use cloudpub_sdk::Connection;
use std::time::Duration;

let conn = Connection::builder()
    .timeout(Duration::from_secs(60))  // Таймаут 1 минута
    .build()
    .await?;
Source

pub fn timeout_secs(self, secs: u64) -> Self

Устанавливает таймаут в секундах.

Удобный метод для установки таймаута в секундах вместо Duration.

§Аргументы
  • secs - Таймаут в секундах
§Пример
use cloudpub_sdk::Connection;

let conn = Connection::builder()
    .timeout_secs(30)  // Таймаут 30 секунд
    .build()
    .await?;
Examples found in repository?
examples/example.rs (line 48)
25async fn main() -> Result<()> {
26    // ====================================================================
27    // ШАГ 1: УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ
28    // ====================================================================
29    println!("1. Подключение к серверу");
30
31    // Создание соединения с использованием паттерна билдера
32    // Билдер позволяет настроить различные параметры соединения
33    let mut conn = Connection::builder()
34        // Указать путь к пользовательскому файлу конфигурации (опционально)
35        // Если не указан, используется системное расположение по умолчанию
36        .config_path(Path::new("/tmp/cloudpub.toml"))
37        // Установить уровень логирования для отладки
38        // Варианты: "trace", "debug", "info", "warn", "error"
39        .log_level("info")
40        // Включить подробный вывод в stderr для отладки
41        // Полезно при разработке, отключите в продакшене
42        .verbose(true)
43        // Предоставить учетные данные для аутентификации
44        // Вы также можете использовать .token() для аутентификации на основе токена
45        .credentials("admin@example.com", "test")
46        // Установить таймаут для операций (в секундах)
47        // Применяется ко всем асинхронным операциям
48        .timeout_secs(3)
49        // Построить и установить соединение
50        // Произойдет аутентификация и ожидание готовности соединения
51        .build()
52        .await?;
53
54    // ====================================================================
55    // ШАГ 2: ПУБЛИКАЦИЯ HTTP СЕРВИСА
56    // ====================================================================
57    println!("2. Публикация нового HTTP сервиса...");
58
59    // Публикация локального HTTP сервиса для доступа через CloudPub
60    let endpoint = conn
61        .publish(
62            Protocol::Http,                           // Тип протокола
63            "localhost:8080".to_string(),             // Локальный адрес для публикации
64            Some("Тестовый HTTP сервис".to_string()), // Человекочитаемое имя сервиса
65            Some(Auth::None),                         // Метод аутентификации для доступа к сервису
66            None,                                     // Без ограничений ACL
67            None,                                     // Без пользовательских заголовков
68            None,                                     // Без правил фильтрации
69        )
70        .await?;
71
72    // Endpoint содержит информацию об опубликованном сервисе
73    // as_url() возвращает публичный URL, по которому доступен сервис
74    println!("  Сервис опубликован: {}", endpoint.as_url());
75
76    // ====================================================================
77    // ШАГ 3: ПУБЛИКАЦИЯ TCP СЕРВИСА
78    // ====================================================================
79    println!("3. Публикация нового TCP сервиса...");
80
81    // TCP сервисы полезны для публикации SSH, баз данных или пользовательских TCP протоколов
82    let endpoint = conn
83        .publish(
84            Protocol::Tcp,                           // TCP протокол
85            "localhost:22".to_string(),              // Локальный SSH порт (пример)
86            Some("Тестовый TCP сервис".to_string()), // Имя сервиса
87            Some(Auth::None),                        // Аутентификация не требуется
88            None,                                    // Без ограничений ACL
89            None,                                    // Без пользовательских заголовков
90            None,                                    // Без правил фильтрации
91        )
92        .await?;
93
94    println!("  Сервис опубликован: {}", endpoint.as_url());
95
96    // Сохранить GUID для последующих операций
97    // GUID уникально идентифицирует этот сервис
98    let service_guid = endpoint.guid.clone();
99
100    // ====================================================================
101    // ШАГ 4: СПИСОК ВСЕХ СЕРВИСОВ
102    // ====================================================================
103    println!("4. Список сервисов:");
104
105    // Получить все сервисы, зарегистрированные текущим пользователем
106    let services = conn.ls().await?;
107
108    // Отобразить каждый сервис с его GUID и URL
109    for service in &services {
110        println!("  {}: {}", service.guid, service.as_url());
111
112        // Сервисы также содержат дополнительные метаданные:
113        // - service.name: Опциональное человекочитаемое имя
114        // - service.status: Текущий статус (работает, остановлен и т.д.)
115        // - service.protocol: Тип протокола
116        // - service.auth: Метод аутентификации
117    }
118
119    // ====================================================================
120    // ШАГ 5: ЗАПУСК СЕРВИСА
121    // ====================================================================
122    println!("5. Запуск сервиса {}...", service_guid);
123
124    // Запустить ранее остановленный сервис
125    // Примечание: Сервисы обычно запускаются автоматически после публикации
126    conn.start(service_guid.clone()).await?;
127    println!("   - Сервис запущен");
128
129    // ====================================================================
130    // ШАГ 6: ПРОВЕРКА СТАТУСА СЕРВИСА
131    // ====================================================================
132    println!("6. Проверка статуса сервиса...");
133
134    // Получить список сервисов снова, чтобы увидеть обновленный статус
135    let services = conn.ls().await?;
136
137    // Найти наш конкретный сервис и отобразить его статус
138    if let Some(service) = services.iter().find(|s| s.guid == service_guid) {
139        println!(
140            "   - Статус сервиса: {}",
141            service.status.as_ref().unwrap_or(&"Неизвестно".to_string())
142        );
143
144        // Поле статуса указывает состояние сервиса:
145        // - "running": Сервис активен и доступен
146        // - "stopped": Сервис зарегистрирован, но не доступен
147        // - "error": Сервис столкнулся с ошибкой
148    }
149
150    let mut buffer = String::new();
151    io::stdin()
152        .read_line(&mut buffer)
153        .expect("Не удалось прочитать строку");
154
155    // ====================================================================
156    // ШАГ 7: ОСТАНОВКА СЕРВИСА
157    // ====================================================================
158    println!("7. Остановка сервиса {}...", service_guid);
159
160    // Остановка делает сервис временно недоступным,
161    // но сохраняет его регистрацию
162    conn.stop(service_guid.clone()).await?;
163    println!("   - Сервис остановлен");
164
165    // ====================================================================
166    // ШАГ 8: ОТМЕНА ПУБЛИКАЦИИ СЕРВИСА
167    // ====================================================================
168    println!("8. Отмена регистрации сервиса {}...", service_guid);
169
170    // Отмена публикации удаляет регистрацию сервиса
171    // Сервис больше не будет доступен через CloudPub
172    conn.unpublish(service_guid.clone()).await?;
173    println!("   - Регистрация сервиса отменена");
174
175    // ====================================================================
176    // ШАГ 9: ПРОВЕРКА УДАЛЕНИЯ
177    // ====================================================================
178    println!("9. Финальный список сервисов...");
179
180    // Получить список сервисов для подтверждения удаления
181    let services = conn.ls().await?;
182    println!("   - Осталось {} сервис(ов)", services.len());
183
184    // ====================================================================
185    // ШАГ 10: ОЧИСТКА ВСЕХ СЕРВИСОВ
186    // ====================================================================
187    println!("10. Очистка всех сервисов...");
188
189    // Clean удаляет все сервисы, зарегистрированные текущим пользователем
190    // Используйте с осторожностью, так как это действие нельзя отменить
191    conn.clean().await?;
192    println!("   - Все сервисы удалены");
193
194    // Проверить, что все сервисы были удалены
195    let services = conn.ls().await?;
196    println!("   Финальное количество: {} сервис(ов)", services.len());
197
198    println!("Демонстрация успешно завершена!");
199
200    // ====================================================================
201    // ОЧИСТКА СОЕДИНЕНИЯ
202    // ====================================================================
203    // Соединение будет автоматически закрыто, когда `conn` выйдет из области видимости
204    // Реализация Drop обрабатывает:
205    // - Отправку сообщения Break для корректной остановки клиента
206    // - Отмену фоновых задач
207    // - Очистку ресурсов
208
209    Ok(())
210}
Source

pub fn check_signal_fn(self, check_fn: CheckSignalFn) -> Self

Устанавливает функцию для проверки сигналов прерывания.

Это в основном используется языковыми обертками (например, Python) для проверки сигналов, таких как Ctrl+C, во время долговременных операций.

§Аргументы
  • check_fn - Функция, которая возвращает ошибку, если операция должна быть прервана
§Пример
use cloudpub_sdk::{Connection, CheckSignalFn};
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};

let interrupted = Arc::new(AtomicBool::new(false));
let interrupted_clone = interrupted.clone();

let check_signal: CheckSignalFn = Arc::new(move || {
    if interrupted_clone.load(Ordering::Relaxed) {
        anyhow::bail!("Operation interrupted")
    }
    Ok(())
});

let conn = Connection::builder()
    .check_signal_fn(check_signal)
    .build()
    .await?;
Source

pub async fn build(self) -> Result<Connection>

Создает и устанавливает соединение с сервером CloudPub.

Этот метод:

  1. Проверяет конфигурацию
  2. Инициализирует логирование
  3. Загружает или создает файл конфигурации
  4. Аутентифицируется на сервере (если предоставлены учетные данные)
  5. Устанавливает соединение
  6. Ожидает готовности соединения
§Возвращает

Возвращает экземпляр Connection при успехе, или ошибку, если:

  • Неверная конфигурация (например, email без пароля)
  • Неудачная аутентификация
  • Не удается установить соединение
  • Происходит таймаут
§Пример
use cloudpub_sdk::Connection;

// Создание с настройками по умолчанию
let conn = Connection::builder().build().await?;

// Создание с пользовательской конфигурацией
let conn = Connection::builder()
    .credentials("user@example.com", "password")
    .log_level("debug")
    .verbose(true)
    .timeout_secs(30)
    .build()
    .await?;
§Ошибки

Этот метод вернет ошибку, если:

  • Email предоставлен без пароля или наоборот
  • Не удалось инициализировать логирование
  • Не удалось загрузить или создать файл конфигурации
  • Неудачная аутентификация
  • Неудачное соединение с сервером
  • Таймаут ожидания соединения
Examples found in repository?
examples/example.rs (line 51)
25async fn main() -> Result<()> {
26    // ====================================================================
27    // ШАГ 1: УСТАНОВЛЕНИЕ СОЕДИНЕНИЯ
28    // ====================================================================
29    println!("1. Подключение к серверу");
30
31    // Создание соединения с использованием паттерна билдера
32    // Билдер позволяет настроить различные параметры соединения
33    let mut conn = Connection::builder()
34        // Указать путь к пользовательскому файлу конфигурации (опционально)
35        // Если не указан, используется системное расположение по умолчанию
36        .config_path(Path::new("/tmp/cloudpub.toml"))
37        // Установить уровень логирования для отладки
38        // Варианты: "trace", "debug", "info", "warn", "error"
39        .log_level("info")
40        // Включить подробный вывод в stderr для отладки
41        // Полезно при разработке, отключите в продакшене
42        .verbose(true)
43        // Предоставить учетные данные для аутентификации
44        // Вы также можете использовать .token() для аутентификации на основе токена
45        .credentials("admin@example.com", "test")
46        // Установить таймаут для операций (в секундах)
47        // Применяется ко всем асинхронным операциям
48        .timeout_secs(3)
49        // Построить и установить соединение
50        // Произойдет аутентификация и ожидание готовности соединения
51        .build()
52        .await?;
53
54    // ====================================================================
55    // ШАГ 2: ПУБЛИКАЦИЯ HTTP СЕРВИСА
56    // ====================================================================
57    println!("2. Публикация нового HTTP сервиса...");
58
59    // Публикация локального HTTP сервиса для доступа через CloudPub
60    let endpoint = conn
61        .publish(
62            Protocol::Http,                           // Тип протокола
63            "localhost:8080".to_string(),             // Локальный адрес для публикации
64            Some("Тестовый HTTP сервис".to_string()), // Человекочитаемое имя сервиса
65            Some(Auth::None),                         // Метод аутентификации для доступа к сервису
66            None,                                     // Без ограничений ACL
67            None,                                     // Без пользовательских заголовков
68            None,                                     // Без правил фильтрации
69        )
70        .await?;
71
72    // Endpoint содержит информацию об опубликованном сервисе
73    // as_url() возвращает публичный URL, по которому доступен сервис
74    println!("  Сервис опубликован: {}", endpoint.as_url());
75
76    // ====================================================================
77    // ШАГ 3: ПУБЛИКАЦИЯ TCP СЕРВИСА
78    // ====================================================================
79    println!("3. Публикация нового TCP сервиса...");
80
81    // TCP сервисы полезны для публикации SSH, баз данных или пользовательских TCP протоколов
82    let endpoint = conn
83        .publish(
84            Protocol::Tcp,                           // TCP протокол
85            "localhost:22".to_string(),              // Локальный SSH порт (пример)
86            Some("Тестовый TCP сервис".to_string()), // Имя сервиса
87            Some(Auth::None),                        // Аутентификация не требуется
88            None,                                    // Без ограничений ACL
89            None,                                    // Без пользовательских заголовков
90            None,                                    // Без правил фильтрации
91        )
92        .await?;
93
94    println!("  Сервис опубликован: {}", endpoint.as_url());
95
96    // Сохранить GUID для последующих операций
97    // GUID уникально идентифицирует этот сервис
98    let service_guid = endpoint.guid.clone();
99
100    // ====================================================================
101    // ШАГ 4: СПИСОК ВСЕХ СЕРВИСОВ
102    // ====================================================================
103    println!("4. Список сервисов:");
104
105    // Получить все сервисы, зарегистрированные текущим пользователем
106    let services = conn.ls().await?;
107
108    // Отобразить каждый сервис с его GUID и URL
109    for service in &services {
110        println!("  {}: {}", service.guid, service.as_url());
111
112        // Сервисы также содержат дополнительные метаданные:
113        // - service.name: Опциональное человекочитаемое имя
114        // - service.status: Текущий статус (работает, остановлен и т.д.)
115        // - service.protocol: Тип протокола
116        // - service.auth: Метод аутентификации
117    }
118
119    // ====================================================================
120    // ШАГ 5: ЗАПУСК СЕРВИСА
121    // ====================================================================
122    println!("5. Запуск сервиса {}...", service_guid);
123
124    // Запустить ранее остановленный сервис
125    // Примечание: Сервисы обычно запускаются автоматически после публикации
126    conn.start(service_guid.clone()).await?;
127    println!("   - Сервис запущен");
128
129    // ====================================================================
130    // ШАГ 6: ПРОВЕРКА СТАТУСА СЕРВИСА
131    // ====================================================================
132    println!("6. Проверка статуса сервиса...");
133
134    // Получить список сервисов снова, чтобы увидеть обновленный статус
135    let services = conn.ls().await?;
136
137    // Найти наш конкретный сервис и отобразить его статус
138    if let Some(service) = services.iter().find(|s| s.guid == service_guid) {
139        println!(
140            "   - Статус сервиса: {}",
141            service.status.as_ref().unwrap_or(&"Неизвестно".to_string())
142        );
143
144        // Поле статуса указывает состояние сервиса:
145        // - "running": Сервис активен и доступен
146        // - "stopped": Сервис зарегистрирован, но не доступен
147        // - "error": Сервис столкнулся с ошибкой
148    }
149
150    let mut buffer = String::new();
151    io::stdin()
152        .read_line(&mut buffer)
153        .expect("Не удалось прочитать строку");
154
155    // ====================================================================
156    // ШАГ 7: ОСТАНОВКА СЕРВИСА
157    // ====================================================================
158    println!("7. Остановка сервиса {}...", service_guid);
159
160    // Остановка делает сервис временно недоступным,
161    // но сохраняет его регистрацию
162    conn.stop(service_guid.clone()).await?;
163    println!("   - Сервис остановлен");
164
165    // ====================================================================
166    // ШАГ 8: ОТМЕНА ПУБЛИКАЦИИ СЕРВИСА
167    // ====================================================================
168    println!("8. Отмена регистрации сервиса {}...", service_guid);
169
170    // Отмена публикации удаляет регистрацию сервиса
171    // Сервис больше не будет доступен через CloudPub
172    conn.unpublish(service_guid.clone()).await?;
173    println!("   - Регистрация сервиса отменена");
174
175    // ====================================================================
176    // ШАГ 9: ПРОВЕРКА УДАЛЕНИЯ
177    // ====================================================================
178    println!("9. Финальный список сервисов...");
179
180    // Получить список сервисов для подтверждения удаления
181    let services = conn.ls().await?;
182    println!("   - Осталось {} сервис(ов)", services.len());
183
184    // ====================================================================
185    // ШАГ 10: ОЧИСТКА ВСЕХ СЕРВИСОВ
186    // ====================================================================
187    println!("10. Очистка всех сервисов...");
188
189    // Clean удаляет все сервисы, зарегистрированные текущим пользователем
190    // Используйте с осторожностью, так как это действие нельзя отменить
191    conn.clean().await?;
192    println!("   - Все сервисы удалены");
193
194    // Проверить, что все сервисы были удалены
195    let services = conn.ls().await?;
196    println!("   Финальное количество: {} сервис(ов)", services.len());
197
198    println!("Демонстрация успешно завершена!");
199
200    // ====================================================================
201    // ОЧИСТКА СОЕДИНЕНИЯ
202    // ====================================================================
203    // Соединение будет автоматически закрыто, когда `conn` выйдет из области видимости
204    // Реализация Drop обрабатывает:
205    // - Отправку сообщения Break для корректной остановки клиента
206    // - Отмену фоновых задач
207    // - Очистку ресурсов
208
209    Ok(())
210}

Trait Implementations§

Source§

impl Default for ConnectionBuilder

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,