Okxlivro - Post Mortem
By Nikita Bishonen
ΠΡΠΈΠ²Π΅Ρ! Π‘Π΅Π³ΠΎΠ΄Π½Ρ Ρ Π΄Π΅Π»ΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΌΡΡΠ»ΡΠΌΠΈ ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ΄ΠΎΠ±Π½ΡΡ Π Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ. ΠΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΡ ΠΈΠ· ΡΠ΅ΡΠΈΠΈ "Post Mortem", Π³Π΄Π΅ Ρ Π±ΡΠ΄Ρ ΠΏΡΠ΅ΠΏΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ. Π‘Π΅Π³ΠΎΠ΄Π½Ρ Π½Π° Π½Π°ΡΠ΅ΠΌ ΡΡΠΎΠ»Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠ½Π΅ Π΄Π°Π»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡ. Π― Π½Π΅ Π»ΡΠ±Π»Ρ ΡΡΠ°ΡΠΈΡΡ ΡΠ²ΠΎΡ Π»ΠΈΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡ ΠΎΡ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ°, Π½ΠΎ Π·Π΄Π΅ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΠΎΠΊΠ°Π·Π°Π»ΡΡ ΠΌΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ ΠΈ Ρ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ».
ΠΠ°ΠΊ ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ, ΡΡΠΎΡ ΠΏΠΎΡΡ Ρ Π½Π°ΡΠ½Ρ Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π»ΠΈΠΊΠ²ΠΈΠ΄Π°ΡΠΈΠΈ Π±Π΅Π·Π³ΡΠ°ΠΌΠΎΡΠ½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Π²Ρ ΡΠ²Π΅ΡΠ΅Π½Ρ Π² ΡΠ²ΠΎΠΈΡ Π·Π½Π°Π½ΠΈΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ Π±ΠΈΡΠΆΠ΅Π²ΠΎΠΉ ΡΠΎΡΠ³ΠΎΠ²Π»ΠΈ, ΡΠΎ ΡΠΌΠ΅Π»ΠΎ ΠΏΡΡΠ³Π°ΠΉΡΠ΅ ΠΊ ΡΡΡΠΈ.
ΠΠΎΡΡΡΠ΅Π»ΠΈ, ΡΡΠ°ΠΊΠ°Π½Ρ ΠΈ Π·Π°ΠΊΠ°Π·Ρ
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ ΡΠΎΡΠ³Π°ΠΌΠΈ, ΡΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠΌ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ·ΡΡΠΈΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΡ Π½Π° ΠΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ. ΠΠ°Π»Π΅Π΅ Ρ ΠΈΠ·Π»Π°Π³Π°Ρ ΡΠ²ΠΎΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡoe ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅ΡΠΎΡΠ½ΡΠΌ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΠ»Π½ΡΠΌ.
ΠΡΠ°ΠΊ, Π² Π’ΠΎΡΠ³Π°Ρ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ:
- ΠΠΎΡΡΡΠ΅Π»Ρ Π·Π°ΠΊΠ°Π·ΠΎΠ²
- ΠΠ°ΠΊΠ°Π·Ρ Π½Π° ΠΏΡΠΎΠ΄Π°ΠΆΡ (Ask side Order)
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΡΠ³ΠΎΠ²ΠΎΠΉ ΠΏΠ°ΡΡ (ΡΡΠΎ Π½Π° ΡΡΠΎ ΠΌΠ΅Π½ΡΡ), ΠΎΠ±ΡΡΠΌ ΠΈ ΡΠ΅Π½Π°
- ΠΠ°ΠΊΠ°Π·Ρ Π½Π° ΠΏΠΎΠΊΡΠΏΠΊΡ (Bid side Order)
- ΠΠ°ΠΊΠ°Π·Ρ Π½Π° ΠΏΡΠΎΠ΄Π°ΠΆΡ (Ask side Order)
ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠ°Ρ ΠΊΠ½ΠΈΠ³Π° ΠΈΠ»ΠΈ ΡΡΠ°ΠΊΠ°Π½ Π³Π΄Π΅ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ Π·Π°ΠΊΠ°Π·Ρ ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΡΡ (Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΆΠ΅Π»Π°ΡΡΠΈΠΉ ΠΏΡΠΎΠ΄Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΡΠΉΡΠΎ Π·Π° ΠΊΠΈΠ»ΠΎΠ³ΡΠ°ΠΌ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΆΠ΅Π»Π°ΡΡΠΈΠΉ ΠΊΡΠΏΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΡΠΉΡΠΎ Π·Π° ΠΊΠΈΠ»ΠΎΠ³ΡΠ°ΠΌ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ), ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠ±Π° Π·Π°ΠΊΠ°Π·Π°.
Π‘ΡΡΡ
ΠΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π‘ΡΡΡΠΊΡΡΡΡ Π½Π° ΠΡΠ½ΠΎΠ²Π΅ ΠΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΠΎΠ΄ΡΠ»Π΅ΠΉ. ΠΠ΄Π΅Π΅ΠΉ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ OKX Π±ΠΈΡΠΆΠ΅ΠΉ, API Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ΄ΠΎΠ±Π΅Π½ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ, Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊe.
Π― ΡΠ΅ΡΠΈΠ» ΡΡΠΎ ΡΡΠΎΠΈΡ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΈΠ΄Π΅ΠΎΠΌΠ°ΡΠΈΡΠ½ΡΠΉ, Π½ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ Π Π°ΡΡ ΠΊΠΎΠ΄ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ, ΡΡΡΠΎΠ³ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠΎΠΊΡΡΡΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Reverse
ΠΠ°ΡΠ½Ρ Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΡΠΏΠΈΡΠΊΠ°ΠΌ Π·Π°ΠΊΠ°Π·ΠΎΠ², ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΎΡ Π»ΡΡΡΠ΅Π³ΠΎ ΠΊ Ρ ΡΠ΄ΡΠ΅ΠΌΡ. ΠΠΎ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠΎΡΠΎΠ½Ρ Π·Π°ΠΊΠ°Π·Π° (ΠΏΠΎΠΊΡΠΏΠ°Π΅ΠΌ\ΠΏΡΠΎΠ΄Π°Π΅ΠΌ), ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΡΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΏΠΎ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ (Π»ΡΡΡΠ΅ ΠΊΡΠΏΠΈΡΡ Π΄Π΅ΡΠ΅Π²Π»Π΅), Π»ΠΈΠ±ΠΎ ΠΏΠΎ ΡΠ±ΡΠ²Π°Π½ΠΈΡ (Π»ΡΡΡΠ΅ ΠΏΡΠΎΠ΄Π°ΡΡ Π΄ΠΎΡΠΎΠΆΠ΅) ΡΠ΅Π½Ρ.
/// Low to high price ordered Map ([`Price`], [`Amount`]) of Asks.
pub struct Asks(BTreeMap<Price, Amount>);
// High to low price ordered Map ([`Price`], [`Amount`]) of Bids.
pub struct Bids(BTreeMap<Reverse<Price>, Amount>);
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡ ΠΎΠΆΠΈΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ - ΠΊΠ°ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π¦Π΅Π½Ρ, Π½ΠΎ ΠΎΠ±Π΅ΡΠ½ΡΡΡ Π΅Ρ Π² Reverse. Π’ΠΎΠ³Π΄Π° ΠΏΡΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΡΡΠΈΡΡΡ ΡΠ΅Π½Ρ Π² ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΡΠΎΡΠΎΠ½Ρ.
Stream
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ΅ΡΠ΅Π· ΠΊΠ°Π½Π°Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π½ΠΎ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π» Π½Π° Π²Π°ΡΠΈΠ°Π½Ρ, Π±ΠΎΠ»Π΅Π΅ ΡΡΠ³ΠΎΠ½ΠΎΠΌΠΈΡΠ½ΡΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
pub fn orderbook_updates(instrument_id: &str) -> Pin<Box<impl Stream<Item = Result<RealtimeData, RealtimeError>>>> {
...
Box::pin(stream! {
...
while let Some(msg) = read.next().await {
...
yield Ok(data);
}
)
}
ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π΅ΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² ΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΡ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ΅ΠΌ-ΡΠΎ ΡΠΎΠ΄Π½ΡΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π½Π°Π΄Π΅Π΅ΡΡΡΡ ΠΈ ΠΆΠ΄Π°ΡΡ.
Enum
ΠΠΎΠ³Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ Π² Π Π°ΡΡ Ρ Π½Π°Ρ ΠΎΠΆΡ ΡΠ΄ΠΎΠ±Π½ΡΠΌΠΈ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΡΠΌΠΈ, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅Π³ΠΎ ΠΌΠ½Π΅ ΡΠΈΠ»ΡΠ½ΠΎ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ - ΡΡΠΎΠ±Ρ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠΉ ΠΈΠΌΠ΅Π»ΠΈ "ΠΏΠ΅ΡΠ²ΠΎ ΠΊΠ»Π°ΡΡΠ½ΡΡ" ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠΈΠΏΠΎΠ² ΡΠ·ΡΠΊΠ°.
pub enum RealtimeData {
Snapshot(SnapshotData),
Update(UpdateData),
}
pub struct SnapshotData(pub (Vec<Order>, Vec<Order>));
pub struct UpdateData(pub (Vec<Order>, Vec<Order>));
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΡ Π±ΠΈΡΠΆΠΈ - ΠΏΠΎ WebSocket ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊ Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ± ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΡΡΡΠ΅Π»Ρ, ΡΠ°ΠΊ ΠΈ ΡΠ»Π΅ΠΏΠΎΠΊ Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΡΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅, ΡΠΎ ΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Ρ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΏΡΡΠ°ΡΡ ΠΈΡ . Π ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ρ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π±ΠΈΠ» ΠΈΡ Π½Π° Π²Π°ΡΠΈΠ°Π½ΡΡ, Π½ΠΎ ΠΈ ΡΠΎΠ·Π΄Π°Π» Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ-ΠΎΠ±ΡΡΡΠΊΠΈ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ.
Convert
ΠΠ»Ρ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ², Ρ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°ΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΠ°ΠΆΠΈ core::convert::(Try)From
- ΡΡΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ°Π΅Ρ ΠΌΠΎΠΉ ΠΊΠΎΠ΄ ΠΊ ΠΊΠΎΠ΄Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
impl TryFrom<&Value> for Order {
type Error = DeserializationError;
fn try_from(value: &Value) -> Result<Self, Self::Error> {
...
}
}
Error
ΠΠ±ΠΎΠΆΠ°Ρ ΠΏΡΠΎΡΡΡΡ, Π½ΠΎ Π±Π΅Π·ΡΠΌΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ derive_more Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΠΌΠΈ ΠΌΠ°ΠΊΡΠΎΡΠ°ΠΌΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π½Π° Π²ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΆΠΈΠ·Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ:
#[derive(Debug, Display, Error, From)]
pub enum RealtimeError {
WebSocket(WsError),
Json(JsonError),
MissingField { source: DeserializationError },
}
ΠΠ΄Π΅ΡΡ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡΠ°ΠΌ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ ΠΈ ΡΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈΠ· Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ - Π²ΡΡ ΡΡΠΎ Π±Π΅Π· Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π½Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΎΡ ΡΡΠΊΠΈ. ΠΠ½ Π΅ΡΡΡ - Π½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ
ΠΡΠ»ΠΈ Π²Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ "ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ" Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ, ΡΠΎ Π²ΠΎΡ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ°.