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?;
§Методы аутентификации
Строитель поддерживает два метода аутентификации:
- На основе токена: Используйте
token()
для аутентификации с существующим токеном - Учетные данные: Используйте
credentials()
илиemail()
/password()
для аутентификации по имени/паролю
§Значения по умолчанию
- Уровень логирования: “info”
- Подробный вывод: false
- Таймаут: 10 секунд
- Путь к конфигурации: Системное расположение по умолчанию (~/.config/cloudpub/client.toml)
Implementations§
Source§impl ConnectionBuilder
impl ConnectionBuilder
Sourcepub fn new() -> Self
pub fn new() -> Self
Создает новый builder с настройками по умолчанию.
§Пример
use cloudpub_sdk::ConnectionBuilder;
let builder = ConnectionBuilder::new();
Sourcepub fn config_path<P: AsRef<Path>>(self, path: P) -> Self
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?
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}
Sourcepub fn log_level<S: Into<String>>(self, level: S) -> Self
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?
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}
Sourcepub fn verbose(self, verbose: bool) -> Self
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?
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}
Sourcepub fn token<S: Into<String>>(self, token: S) -> Self
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?;
Sourcepub fn credentials<S: Into<String>>(self, email: S, password: S) -> Self
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?
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}
Sourcepub fn email<S: Into<String>>(self, email: S) -> Self
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?;
Sourcepub fn password<S: Into<String>>(self, password: S) -> Self
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?;
Sourcepub fn timeout(self, timeout: Duration) -> Self
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?;
Sourcepub fn timeout_secs(self, secs: u64) -> Self
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?
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}
Sourcepub fn check_signal_fn(self, check_fn: CheckSignalFn) -> Self
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?;
Sourcepub async fn build(self) -> Result<Connection>
pub async fn build(self) -> Result<Connection>
Создает и устанавливает соединение с сервером CloudPub.
Этот метод:
- Проверяет конфигурацию
- Инициализирует логирование
- Загружает или создает файл конфигурации
- Аутентифицируется на сервере (если предоставлены учетные данные)
- Устанавливает соединение
- Ожидает готовности соединения
§Возвращает
Возвращает экземпляр 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?
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§
Auto Trait Implementations§
impl Freeze for ConnectionBuilder
impl !RefUnwindSafe for ConnectionBuilder
impl Send for ConnectionBuilder
impl Sync for ConnectionBuilder
impl Unpin for ConnectionBuilder
impl !UnwindSafe for ConnectionBuilder
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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