Telegram Group & Telegram Channel
🦀 Rust и магия динамики: как создать Python‑подобный API с помощью Serde

В новой статье *Ohad Dravid* демонстрирует, как в языке Rust можно добиться удобства динамического доступа к данным — в духе Python — но без потери строгой типизации и производительности. Всё это — с помощью мощной библиотеки serde.

📌 Статья: *“A Rust API Inspired by Python, Powered by Serde”*
🔗 [ohadravid.github.io/posts/2025-05-serde-reflect](https://ohadravid.github.io/posts/2025-05-serde-reflect/)

🔍 Проблема

Python позволяет обращаться к произвольным полям объектов, например при работе с WMI:


for fan in c.Win32_Fan():
print(fan.Name, fan.DesiredSpeed)


А вот Rust требует ручной работы: если вы хотите получить поле объекта по имени — нужно писать get_attr, делать match, проверять типы и всё это каждый раз.

🙄 Это:
- многословно,
- подвержено ошибкам,
- неудобно для пользователя API.

🎯 Цель

Сделать API на Rust, который позволял бы:

1. Писать простой, декларативный код
2. Избегать ручной сериализации и проверки типов
3. Получать строго типизированные структуры из «сырых» данных

И всё это — без хаков и макросов, а с помощью serde и аккуратной архитектуры.

⚙️ Как это реализовано

Охад реализует три версии API:

🛠 1. raw_api.rs — примитивный уровень


pub enum Value { Bool(bool), I1(i8), UI8(u64), String(String), Object(Object) }

impl Object {
pub fn get_attr(&self, name: &str) -> Value { /* ... */ }
}


Каждый вызов требует ручного match, приведения типов, извлечения значений.

2. v1_api.rs — пользователь сам описывает структуру + ручная десериализация

Пользователь описывает struct, и сам реализует для него трейт, чтобы распаковать поля.

🚀 3. v2_api.rs — Serde‑магию включено

Теперь query() возвращает Vec<T>:


#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Fan {
name: String,
active_cooling: bool,
desired_speed: u64,
}

let res: Vec<Fan> = query();
for fan in res {
if fan.active_cooling {
println!("Fan `{}` is running at {} RPM", fan.name, fan.desired_speed);
}
}


Теперь:
- никакой ручной сериализации
- никаких match
- всё строго типизировано и работает с минимальными затратами

🧠 Как это работает под капотом

Проект использует:

serde::Deserialize
• внутренний модуль meta.rs, который:
- извлекает названия полей и их типы
- генерирует SQL‑подобный запрос под структуру
- использует эти поля для сопоставления данных

API получается универсальным: любую структуру, которая реализует Deserialize, можно использовать как результат запроса.

📈 Почему это важно

Приближает Rust к удобству Python, сохраняя безопасность
Минимизирует дублирование кода
Даёт мощный, типобезопасный интерфейс над динамическими структурами
Применимо к WMI, COM, JSON API, SQL‑слоям и множеству других задач

🔭 Возможности расширения

- Генерация запросов по структурам (`SELECT ... FROM ... WHERE ...`)
- Интеграция с внешними API (WMI, COM)
- Расширение в сторону serde-reflection для полного introspection
- Создание DSL поверх API для ещё более лаконичного запроса данных

📚 Заключение

Rust и serde — это не только про производительность и безопасность, но и про удобный API, если правильно подойти к задаче. Этот проект показывает, как можно сделать гибкий, декларативный, типобезопасный интерфейс для работы с данными — без костылей и магии рантайма.

Если ты когда-либо хотел писать на Rust как на Python — но без ущерба для надёжности — это один из лучших паттернов, который стоит изучить.

🔗 Читай подробнее: [ohadravid.github.io/posts/2025-05-serde-reflect](https://ohadravid.github.io/posts/2025-05-serde-reflect/)\



tg-me.com/rust_code/961
Create:
Last Update:

🦀 Rust и магия динамики: как создать Python‑подобный API с помощью Serde

В новой статье *Ohad Dravid* демонстрирует, как в языке Rust можно добиться удобства динамического доступа к данным — в духе Python — но без потери строгой типизации и производительности. Всё это — с помощью мощной библиотеки serde.

📌 Статья: *“A Rust API Inspired by Python, Powered by Serde”*
🔗 [ohadravid.github.io/posts/2025-05-serde-reflect](https://ohadravid.github.io/posts/2025-05-serde-reflect/)

🔍 Проблема

Python позволяет обращаться к произвольным полям объектов, например при работе с WMI:


for fan in c.Win32_Fan():
print(fan.Name, fan.DesiredSpeed)


А вот Rust требует ручной работы: если вы хотите получить поле объекта по имени — нужно писать get_attr, делать match, проверять типы и всё это каждый раз.

🙄 Это:
- многословно,
- подвержено ошибкам,
- неудобно для пользователя API.

🎯 Цель

Сделать API на Rust, который позволял бы:

1. Писать простой, декларативный код
2. Избегать ручной сериализации и проверки типов
3. Получать строго типизированные структуры из «сырых» данных

И всё это — без хаков и макросов, а с помощью serde и аккуратной архитектуры.

⚙️ Как это реализовано

Охад реализует три версии API:

🛠 1. raw_api.rs — примитивный уровень


pub enum Value { Bool(bool), I1(i8), UI8(u64), String(String), Object(Object) }

impl Object {
pub fn get_attr(&self, name: &str) -> Value { /* ... */ }
}


Каждый вызов требует ручного match, приведения типов, извлечения значений.

2. v1_api.rs — пользователь сам описывает структуру + ручная десериализация

Пользователь описывает struct, и сам реализует для него трейт, чтобы распаковать поля.

🚀 3. v2_api.rs — Serde‑магию включено

Теперь query() возвращает Vec<T>:


#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Fan {
name: String,
active_cooling: bool,
desired_speed: u64,
}

let res: Vec<Fan> = query();
for fan in res {
if fan.active_cooling {
println!("Fan `{}` is running at {} RPM", fan.name, fan.desired_speed);
}
}


Теперь:
- никакой ручной сериализации
- никаких match
- всё строго типизировано и работает с минимальными затратами

🧠 Как это работает под капотом

Проект использует:

serde::Deserialize
• внутренний модуль meta.rs, который:
- извлекает названия полей и их типы
- генерирует SQL‑подобный запрос под структуру
- использует эти поля для сопоставления данных

API получается универсальным: любую структуру, которая реализует Deserialize, можно использовать как результат запроса.

📈 Почему это важно

Приближает Rust к удобству Python, сохраняя безопасность
Минимизирует дублирование кода
Даёт мощный, типобезопасный интерфейс над динамическими структурами
Применимо к WMI, COM, JSON API, SQL‑слоям и множеству других задач

🔭 Возможности расширения

- Генерация запросов по структурам (`SELECT ... FROM ... WHERE ...`)
- Интеграция с внешними API (WMI, COM)
- Расширение в сторону serde-reflection для полного introspection
- Создание DSL поверх API для ещё более лаконичного запроса данных

📚 Заключение

Rust и serde — это не только про производительность и безопасность, но и про удобный API, если правильно подойти к задаче. Этот проект показывает, как можно сделать гибкий, декларативный, типобезопасный интерфейс для работы с данными — без костылей и магии рантайма.

Если ты когда-либо хотел писать на Rust как на Python — но без ущерба для надёжности — это один из лучших паттернов, который стоит изучить.

🔗 Читай подробнее: [ohadravid.github.io/posts/2025-05-serde-reflect](https://ohadravid.github.io/posts/2025-05-serde-reflect/)\

BY Rust


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/rust_code/961

View MORE
Open in Telegram


Rust Telegram | DID YOU KNOW?

Date: |

Spiking bond yields driving sharp losses in tech stocks

A spike in interest rates since the start of the year has accelerated a rotation out of high-growth technology stocks and into value stocks poised to benefit from a reopening of the economy. The Nasdaq has fallen more than 10% over the past month as the Dow has soared to record highs, with a spike in the 10-year US Treasury yield acting as the main catalyst. It recently surged to a cycle high of more than 1.60% after starting the year below 1%. But according to Jim Paulsen, the Leuthold Group's chief investment strategist, rising interest rates do not represent a long-term threat to the stock market. Paulsen expects the 10-year yield to cross 2% by the end of the year. A spike in interest rates and its impact on the stock market depends on the economic backdrop, according to Paulsen. Rising interest rates amid a strengthening economy "may prove no challenge at all for stocks," Paulsen said.

Tata Power whose core business is to generate, transmit and distribute electricity has made no money to investors in the last one decade. That is a big blunder considering it is one of the largest power generation companies in the country. One of the reasons is the company's huge debt levels which stood at ₹43,559 crore at the end of March 2021 compared to the company’s market capitalisation of ₹44,447 crore.

Rust from cn


Telegram Rust
FROM USA