1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright The Pit Project Owners. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Please see https://github.com/openpitkit and the OWNERS file for details.
use Duration;
use cratePrice;
/// Current market snapshot for an instrument.
///
/// Every field is optional: producers publish only the fields they actually
/// have. How a `Quote` interacts with the slot's previously stored value is
/// chosen by the publisher when calling the service:
///
/// - [`MarketDataService::push`](super::service::MarketDataService::push)
/// replaces the entire snapshot - any field left as `None` in the new quote
/// is cleared from the slot.
/// - [`MarketDataService::push_patch`](super::service::MarketDataService::push_patch)
/// merges the new quote into the existing snapshot - `None` fields preserve
/// the prior value, `Some` fields overwrite it.
///
/// In either case the slot's publish instant is bumped to the current time.
///
/// `#[non_exhaustive]` keeps the door open for further optional fields in
/// future releases.
/// Maximum age allowed for a stored quote before it is treated as
/// unavailable.
///
/// `QuoteTtl` is the public, two-state lifetime callers supply at the setter
/// and registration boundaries. It maps onto the internal cascade as follows:
///
/// - As the service-wide default on
/// [`MarketDataBuilder`](super::builder::MarketDataBuilder) it is the lowest
/// cascade tier, applied only when no more specific axis is set.
/// - At registration via
/// [`register_with_ttl`](super::service::MarketDataService::register_with_ttl)
/// /
/// [`register_with_id_and_ttl`](super::service::MarketDataService::register_with_id_and_ttl)
/// it becomes the instrument-level setting.
/// - The per-account, per-group, and instrument-qualified setters
/// (`set_*_ttl`) pin the matching axis cell.
///
/// The effective lifetime for a read is resolved by the cascade for the
/// requested `(account, group)`; see
/// [`MarketDataService`](super::service::MarketDataService) for the tier
/// order. After a successful [`push`](super::service::MarketDataService::push)
/// or [`push_patch`](super::service::MarketDataService::push_patch) the quote
/// is observable through [`get`](super::service::MarketDataService::get) until
/// at least the effective lifetime has elapsed; reads after that point return
/// an expired-quote error (the entry is not removed from storage, only hidden
/// from optional consumers).