Giter Club home page Giter Club logo

ferrumfix's Introduction

FerrumFIX

Crates.io Website Docs.rs Minimal rustc version matrix.org License CI status

Love FerrumFIX? Buy me a coffee and support the project!

FerrumFIX is a free and open source FIX engine implementation in Rust. Please note that it's currently under heavy development and wildly unstable, so all interested parties should refrain from using it in production prior to its 1.0 release. Performance and full adherence to the FIX protocol are nevertheless core goals of the project which, if anything, might serve as a useful foundation for others' work.

About

FerrumFIX provides parsing, validation, error recovery, and (de)serialization for the FIX family of protocols.

FIX Technical Standard stack

The above illustration succintly describes the full scope of FIX and it serves as a reference point for all modern FIX implementations. FerrumFIX aims with total compliance... eventually. Engineering efforts are initially focused on core features e.g. tag-value encoding and FIX 4.4.

FerrumFIX enforces strict separation of concerns according to the OSI model, as reasonably allowed by the FIX specification.

  • Layer 4 (Transport Layer): fefixs.
  • Layer 5 (Session Layer): fefix::session.
  • Layer 6 (Presentation Layer): fefix::tagvalue, fefix::json, fefast.
  • Layer 7 (Application Layer): fefix::Dictionary.

You don't have to understand the whole tech stack to use a single layer; in fact, FerrumFIX makes sure that you only ever need to worry about layers above your chosen abstraction level. For most users, that would be Layer 7 (i.e. semantics of FIX messages and business logic). On the other hand, you will need to delve deep into lower layers in case you plan on building a fully-fledged FIX engine.

Core features:

  • Code generation (Rust, possibly others).
  • FIX 4.2.
  • FIX 4.4.
  • FIX 5.0 Service Pack 2.

Encodings:

  • Tagvalue (classic FIX).
  • FIXML.
  • Simple Binary Encoding (SBE).
  • Google Protocol Buffers (GPB).
  • JavaScript Object Notation (JSON).
  • Abstract Syntax Notation (ASN.1).
  • FIX Adapted for STreaming (FAST).

Sponsors

FerrumFIX is kindly sponsored by Bitwyre. Bitwyre is a next gen, HFT-friendly Cryptocurrency Derivatives Exchange.

Bitwyre logo

Please reach out at <[email protected]> for business inquiries.

Contributing

All development happens on GitHub at ferrumfix/ferrumfix. Contributions both from volunteers and companies are welcome. Depending on the size and scope of your intended contributions, it's likely a good idea to open beforehand a GitHub issue to discuss any details. Please note that our branching strategy is inspired by the (in)famous Git Flow, which is a good fit for software that requires complex versioning such as FIX implementations. Versioning adheres to SemVer 2.0.

Legal

FerrumFIX is available under the terms of the MIT license and Apache License 2.0, at your choice. See LICENSE-MIT.txt and LICENSE-APACHE.txt in this repository for more information.

All FIX Protocol-related intellectual property, including but not limited to the original documentation that ships with FerrumFIX, is licensed by FIX Protocol Ltd. under Creative Commons Attribution - No Derivatives 4.0 International (CC BY-ND 4.0). By contributing to this project you agree to comply with all license requirements.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

ferrumfix's People

Contributors

cryptopatrick avatar dependabot[bot] avatar gsnoff avatar hailios avatar l4l avatar lmjw avatar mikaelmello avatar neysofu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ferrumfix's Issues

Some tag-value messages seem to break internal state of a `Decoder` on `fefix v0.7.0`

Consider this example test function:

#[test]
fn decode() {
    use fefix::{definitions::fix44, prelude::*, tagvalue::{Config, Decoder}};
    const SAMPLES: [&[u8]; 2] = [
        b"8=FIX.4.4\x019=176\x0135=X\x0149=ERISX\x0156=XXXXXXXXX\x0134=3\x01\
        52=20220714-09:26:22.518\x01262=TEST-220714092622-EfkcibvXPhF34SVNQYwwRz\x01\
        60=20220714-09:26:22.517712684\x016006=0\x01268=1\x01279=0\x01269=J\x01\
        55=BTC/USD\x0115=BTC\x0110=051\x01",

        b"8=FIX.4.4\x019=227\x0135=f\x0149=ERISX\x0156=XXXXXXXXX\x0134=4\x01\
        52=20220714-09:26:22.518\x01324=TEST-220714092622-EfkcibvXPhF34SVNQYwwRz\x01\
        60=20220714-09:26:22.517712684\x0155=BTC/USD\x01460=2\x01107=BTC/USD\x016006=0\x01\
        15=BTC\x01326=17\x01969=0.1\x01562=0.0001\x011140=100000\x01561=0.000001\x0110=248\x01",
    ];
    let mut decoder = Decoder::<Config>::new(Dictionary::fix44());
    for sample in SAMPLES {
        let message = decoder.decode(sample)
            .expect("Couldn't decode sample FIX message");
        let msg_type = message.fv::<fix44::MsgType>(fix44::MSG_TYPE);
        assert!(msg_type.is_ok(), "fv() returns {:?}", msg_type);
    }
}

When compiled with crate fefix version 0.7.0, it fails with the following message:

thread 'decode' panicked at 'fv() returns Err(None)', [PATH]:[LINE]:[COLUMN]

Interestingly enough, each of the samples succeeds when passed through a separate Decoder instance solo. However when they’re passed in the given sequence to a single Decoder, random access to any of the fields of the second message (as well as of any other messages to follow it) will fail.

`StreamingDecoder::num_bytes_required()` semantical inconsistency

The default implementation of StreamingDecoder::fillable() apparently expects num_bytes_required() to return full buffer length required for parsing, since Buffer::resize() is supposed to take full length in new_len. However it also looks like RawDecoderStreaming has a different idea in its own num_bytes_required() impl, returning a difference between expected and current length, which leads to erratic parsing when fillable() is used.

Add usage examples for FIXS initiator and acceptor

TLS issues are common among FIX users and it'd be great to have a good set of examples. Ideally, we would showcase how to use FerrumFIX's FIXS layer together with both Tokio and std::net::TcpStream. Currently, we only support openssl, so that's what the examples will use for TLS. Adding support (and examples!) for rustls would make a lot of sense down the road.

Compile errors

Describe the bug
Hi @neysofu
I compiled fefix in my project, there are some compile errors:

error[E0658]: the `unsafe_op_in_unsafe_fn` lint is unstable
  --> C:\Users\Auser\.cargo\registry\src\github.com-1ecc6299db9ec823\fefix-0.6.0\src\lib.rs:62:1
   |
62 | / #![deny(
63 | |     unused,
64 | |     missing_debug_implementations,
65 | |     unsafe_op_in_unsafe_fn,
...  |
74 | |     clippy::needless_lifetimes
75 | | )]
   | |__^
   |
   = note: see issue #71668 <https://github.com/rust-lang/rust/issues/71668> for more information
   = help: add `#![feature(unsafe_block_in_unsafe_fn)]` to the crate attributes to enable

error[E0710]: an unknown tool name found in scoped lint: `rustdoc::broken_intra_doc_links`
  --> C:\Users\Auser\.cargo\registry\src\github.com-1ecc6299db9ec823\fefix-0.6.0\src\lib.rs:66:5
   |
66 |     rustdoc::broken_intra_doc_links,
   |     ^^^^^^^

   Compiling polars-lazy v0.13.3 (https://github.com/ritchie46/polars#a749f494)
error: aborting due to 2 previous errors

Some errors have detailed explanations: E0658, E0710.
For more information about an error, try `rustc --explain E0658`.
error: could not compile `fefix`

Would you like take a look at those errors, thanks.

Run comprehensive test suite nightly

As Fasters becomes less and less just another FIX implementation and more of a tool to roll your own fully-fledged FIX engine, we'll need comprehensive test suites to test FIX connections and other session layer details. The "classic" session layer specification comes bundled with some official test cases, which seem like a really good starting point but aren't as comprehensive as I'd like them to be. FIXimulator, on the other hand, may be harder to setup but seems like the best open-source solution available. Feedback and opinions are welcome.

RUSTSEC-2022-0004: Stack overflow in rustc_serialize when parsing deeply nested JSON

Stack overflow in rustc_serialize when parsing deeply nested JSON

Details
Package rustc-serialize
Version 0.3.24
Date 2022-01-01

When parsing JSON using json::Json::from_str, there is no limit to the depth of the stack, therefore deeply nested objects can cause a stack overflow, which aborts the process.

Example code that triggers the vulnerability is

fn main() {
    let _ = rustc_serialize::json::Json::from_str(&amp;&quot;[0,[&quot;.repeat(10000));
}

serde is recommended as a replacement to rustc_serialize.

See advisory page for additional details.

Spurious failures when decoding a message

Describe the bug
Message decoding fails spuriously.

To Reproduce
I am running a very simple test that decodes a fixed message generated with ferrum

diff --git a/crates/fefix/src/tagvalue/decoder.rs b/crates/fefix/src/tagvalue/decoder.rs
index 8b9ab22..3e4632a 100644
--- a/crates/fefix/src/tagvalue/decoder.rs
+++ b/crates/fefix/src/tagvalue/decoder.rs
@@ -863,4 +863,25 @@ mod test {
             codec.clear();
         }
     }
+
+    #[test]
+    fn test_parse() {
+        let msg1 = vec![
+            56, 61, 70, 73, 88, 46, 52, 46, 52, 1, 57, 61, 48, 48, 48, 48, 48, 48, 54, 51, 1, 51,
+            53, 61, 49, 1, 52, 57, 61, 84, 65, 82, 71, 69, 84, 1, 53, 54, 61, 83, 69, 78, 68, 69,
+            82, 1, 51, 52, 61, 49, 1, 53, 50, 61, 50, 48, 50, 50, 49, 48, 50, 55, 45, 49, 49, 58,
+            52, 56, 58, 51, 49, 46, 49, 51, 49, 1, 49, 49, 50, 61, 49, 48, 48, 1, 49, 48, 61, 50,
+            49, 54, 1,
+        ];
+        assert_eq!(std::str::from_utf8(msg1.as_slice()).unwrap(), "8=FIX.4.4\u{1}9=00000063\u{1}35=1\u{1}49=TARGET\u{1}56=SENDER\u{1}34=1\u{1}52=20221027-11:48:31.131\u{1}112=100\u{1}10=216\u{1}");
+
+        let mut decoder = Decoder::<Config>::new(Dictionary::fix44());
+        let fix_msg = decoder.decode(msg1).unwrap();
+
+        assert_eq!(fix_msg.fv::<&str>(35).unwrap(), "1");
+        assert_eq!(fix_msg.fv::<&str>(49).unwrap(), "TARGET");
+        assert_eq!(fix_msg.fv::<&str>(56).unwrap(), "SENDER");
+        assert_eq!(fix_msg.fv::<u64>(34).unwrap(), 1);
+        assert_eq!(fix_msg.fv::<u32>(112).unwrap(), 100);
+    }
 }

Expected behavior
Test consistently passes

Actual behavior
Test sometimes fails

$ for i in {1..10}; do cargo test -p fefix test_parse 2>/dev/null; done

running 1 test
test tagvalue::decoder::test::test_parse ... FAILED

failures:

---- tagvalue::decoder::test::test_parse stdout ----
[crates/fefix/src/tagvalue/decoder.rs:638] looking for FieldLocator { tag: 35, context: TopLevel }
[crates/fefix/src/tagvalue/decoder.rs:638] looking for FieldLocator { tag: 49, context: TopLevel }
thread 'tagvalue::decoder::test::test_parse' panicked at 'assertion failed: `(left == right)`
  left: `"g: 49,"`,
 right: `"TARGET"`', crates/fefix/src/tagvalue/decoder.rs:882:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    tagvalue::decoder::test::test_parse

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.15s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.15s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.15s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s


running 1 test
test tagvalue::decoder::test::test_parse ... FAILED

failures:

---- tagvalue::decoder::test::test_parse stdout ----
[crates/fefix/src/tagvalue/decoder.rs:638] looking for FieldLocator { tag: 35, context: TopLevel }
[crates/fefix/src/tagvalue/decoder.rs:638] looking for FieldLocator { tag: 49, context: TopLevel }
thread 'tagvalue::decoder::test::test_parse' panicked at 'assertion failed: `(left == right)`
  left: `"g: 49,"`,
 right: `"TARGET"`', crates/fefix/src/tagvalue/decoder.rs:882:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    tagvalue::decoder::test::test_parse

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s


running 1 test
test tagvalue::decoder::test::test_parse ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s


running 1 test
test tagvalue::decoder::test::test_parse ... FAILED

failures:

---- tagvalue::decoder::test::test_parse stdout ----
[crates/fefix/src/tagvalue/decoder.rs:638] looking for FieldLocator { tag: 35, context: TopLevel }
[crates/fefix/src/tagvalue/decoder.rs:638] looking for FieldLocator { tag: 49, context: TopLevel }
thread 'tagvalue::decoder::test::test_parse' panicked at 'assertion failed: `(left == right)`
  left: `"g: 49,"`,
 right: `"TARGET"`', crates/fefix/src/tagvalue/decoder.rs:882:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    tagvalue::decoder::test::test_parse

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 83 filtered out; finished in 0.14s

Desktop (please complete the following information):

  • OS: MacOS Mojave (10.14.6 (18G4032))
  • Version rustc 1.64.0 (a55dd71d5 2022-09-19)

How to set Password and use config files to connect a Acceptor?

Hi @neysofu ,

I wrote a rust program that use ferrumfix to read FIX message from an acceptor, there are two config file: FIX44.xml and session.cfg, but I don't know how to use them. Would you like to give some examples for this.

Another question is how to set Password to connect a Acceptor? I didn't find any examples?

Thank you.

raw_decoder: panic occured message=slice index starts at 16 but ends at 13

I have a simple streaming reader implementation:

struct Reader<R> {
    decoder: DecoderBuffered,
    rx: R
}

impl<R> Reader<R> {
    pub fn new(decoder: DecoderBuffered, rx: R) -> Self {
        Self { decoder, rx }
    }
}

impl<R: AsyncRead + Unpin> Reader<R> {
    async fn next(&mut self) -> Option<Message<'_, &[u8]>> {
        let mut buf = self.decoder.supply_buffer();
        info!("supply_buffer", len = buf.len(), buf = String::from_utf8_lossy(buf));
        loop {
            match self.rx.read_exact(buf).await {
                Ok(read) => {
                    info!("buf filled", buf = String::from_utf8_lossy(buf));
                    assert_eq!(read, buf.len());
                }
                Err(err) => {
                    error!("read error", error = err);
                    return None;
                }
            }
            match self.decoder.parse() {
                Ok(None) => {
                    buf = self.decoder.supply_buffer();
                    info!("new supply_buffer", len = buf.len(), buf = String::from_utf8_lossy(buf));
                }
                Ok(Some(())) => {
                    return Some(self.decoder.message());
                }
                Err(err) => {
                    error!("FIX decode error", error = err);
                    return None;
                }
            }
        }
    }
}

I received Logon message part, filling the supply_buffer:

buf filled	buf=8=FIX.4.2�9=177�35=A

But there is a panic while parsing it:

panic occured	message=slice index starts at 16 but ends at 13	file=/home/injecto/.cargo/registry/src/github.com-1ecc6299db9ec823/fefix-0.7.0/src/tagvalue/raw_decoder.rs
fefix::tagvalue::raw_decoder::RawFrame<T>::payload::h5055a2b40c2a26c7 at /home/injecto/.cargo/registry/src/github.com-1ecc6299db9ec823/fefix-0.7.0/src/tagvalue/raw_decoder.rs:79
fefix::tagvalue::decoder::Decoder<C>::from_frame::h4fb3aa5c46480c23 at /home/injecto/.cargo/registry/src/github.com-1ecc6299db9ec823/fefix-0.7.0/src/tagvalue/decoder.rs:100
fefix::tagvalue::decoder::DecoderBuffered<C>::parse::hb3c4abcc7e6733b7 at /home/injecto/.cargo/registry/src/github.com-1ecc6299db9ec823/fefix-0.7.0/src/tagvalue/decoder.rs:272

Would you like to change Edition to 2018

Hi @neysofu

Is your feature request related to a problem? Please describe.
Thanks for your work on this crates ferrumfix.

I think there are many old rust programs that cannot use Edition 2021, if you can modify the Edition to 2018, it may be used in a wider range. So would you like to change Edition to 2018?

Thanks again.

stdsimd feature removed

Describe the bug
The stdsimd feature has been removed in the latest nightly builds. This will soon transition to stable. fefix is unable to build on nightly because it has a dependency on an old version of sqlx, which in turn has an old version of ahash as a dependency.

To Reproduce
Steps to reproduce the behavior:

  1. create a project using ferrumfix, version = "0.7.0"
  2. rustup override set nightly
  3. cargo clippy
  4. See error
error[E0635]: unknown feature `stdsimd`
  --> /home/user/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ahash-0.7.6/src/lib.rs:99:42
   |
99 | #![cfg_attr(feature = "stdsimd", feature(stdsimd))]
   |                                          ^^^^^^^

For more information about this error, try `rustc --explain E0635`.
error: could not compile `ahash` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

Expected behavior
Build completes without error.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: Linux

Additional context
I can see that you have removed this dependency in the HEAD, could you please release a new build? Alternatively, could do an update based on the 0.7.0 tag that uses ahash v0.7.8

Implement main encoding types

Here's a list of the encoding types that I eventually wish to implement for Fasters:

  • tag-value
  • FAST
  • JSON (with serde-json)
  • Simple Binary Encoding, both LE and BE variants
  • Google protobufs (possibly prost)
  • FIXML (xml-rs or quick-xml)

The ASN.1 is very low on the priority list and it needs further evaluation before any work is done.

`fefix::tagvalue::DecoderStreaming` appears to be practically broken at this point

This sample test fails with the following stack trace:

#[test]
fn decode_streaming() {
    use fefix::{definitions::fix44, prelude::*, tagvalue::{Config, Decoder}};
    use std::io::{Cursor, Read};
    const SAMPLE: &[u8] =
        b"8=FIX.4.4\x019=176\x0135=X\x0149=ERISX\x0156=XXXXXXXXX\x0134=3\x01\
        52=20220714-09:26:22.518\x01262=TEST-220714092622-EfkcibvXPhF34SVNQYwwRz\x01\
        60=20220714-09:26:22.517712684\x016006=0\x01268=1\x01279=0\x01269=J\x01\
        55=BTC/USD\x0115=BTC\x0110=051\x01";
    let mut decoder = Decoder::<Config>::new(Dictionary::fix44())
        .streaming(vec![]);
    let mut cursor = Cursor::new(SAMPLE);
    loop {
        cursor.read_exact(decoder.fillable())
            .expect("Couldn't read FIX message from sample data");
        if decoder.try_parse().expect("Couldn't parse FIX message").is_some() {
            let message = decoder.message();
            let msg_type = message.fv::<fix44::MsgType>(fix44::MSG_TYPE);
            assert!(msg_type == Ok(fix44::MsgType::MarketDataIncrementalRefresh));
            break;
        }
    }
}
thread 'fix::decode_streaming' panicked at 'assertion failed: self.is_ready', [HOME]/.cargo/git/checkouts/ferrumfix-a26279be45830ba8/2eed72a/crates/fefix/src/tagvalue/decoder.rs:283:9
stack backtrace:
   0:     0x5614ec5a17cd - std::backtrace_rs::backtrace::libunwind::trace::hb729d9642bb971eb
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x5614ec5a17cd - std::backtrace_rs::backtrace::trace_unsynchronized::h373bb774579df5c7
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x5614ec5a17cd - std::sys_common::backtrace::_print_fmt::hfbd4e92d240c89bb
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/sys_common/backtrace.rs:66:5
   3:     0x5614ec5a17cd - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h8f618991fbf64972
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/sys_common/backtrace.rs:45:22
   4:     0x5614ec5c591c - core::fmt::write::hc69b5b640d88cce8
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/core/src/fmt/mod.rs:1196:17
   5:     0x5614ec59bb31 - std::io::Write::write_fmt::h3403cef06a24a303
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/io/mod.rs:1654:15
   6:     0x5614ec5a32a5 - std::sys_common::backtrace::_print::h368f27cdedea0e52
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/sys_common/backtrace.rs:48:5
   7:     0x5614ec5a32a5 - std::sys_common::backtrace::print::ha105c9cf5a64cd17
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/sys_common/backtrace.rs:35:9
   8:     0x5614ec5a32a5 - std::panicking::default_hook::{{closure}}::h48ed2c3707d5e20e
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/panicking.rs:295:22
   9:     0x5614ec5a2f19 - std::panicking::default_hook::h8744fc5cea5e3110
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/panicking.rs:314:9
  10:     0x5614ec5a3878 - std::panicking::rust_panic_with_hook::hc82286af2030e925
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/panicking.rs:698:17
  11:     0x5614ec5a36e9 - std::panicking::begin_panic_handler::{{closure}}::h1c15057c2f09081f
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/panicking.rs:586:13
  12:     0x5614ec5a1c84 - std::sys_common::backtrace::__rust_end_short_backtrace::h65de906a5330f8da
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/sys_common/backtrace.rs:138:18
  13:     0x5614ec5a3459 - rust_begin_unwind
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/panicking.rs:584:5
  14:     0x5614ec0d1d73 - core::panicking::panic_fmt::h741cfbfc95bc6112
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/core/src/panicking.rs:142:14
  15:     0x5614ec0d1c3d - core::panicking::panic::hab046c3856b52f65
                               at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/core/src/panicking.rs:48:5
  16:     0x5614ec1db0c1 - fefix::tagvalue::decoder::DecoderStreaming<B,C>::message::h2186a8cee01df512
                               at [HOME]/.cargo/git/checkouts/ferrumfix-a26279be45830ba8/2eed72a/crates/fefix/src/tagvalue/decoder.rs:283:9
  17:     0x5614ec0d59ba - decode_streaming::h[HASH]
                               at [PATH]:[LINE]:[COLUMN]

It seems to me that DecoderStreaming::try_parse() doesn’t set the is_ready flag to true once parsing is completed. Also, I believe that its StreamingDecoder::clear() impl should also take care of that flag, seeing as the default impl only takes care of the buffer.

Alternatively, DecoderStreaming::message() might check the state of self.raw_decoder instead, so that the need for the flag may be completely avoided here.

Interestingly, in fefix v0.7.0 DecoderBuffered also fails with similarly looking symptoms, but a quite different underlying cause. What seems to be happening there is, DecoderBuffered assumes (incorrectly) that by the time when that version of RawDecoderBuffered::raw_frame() returns Ok(Some(())), parsing must have already been completed. However RawDecoderBuffered by itself doesn’t check whether the filled buffer length is matching the expected, and so would return Ok(Some(())) even after having just parsed the header fields BeginString and BodyLength.

tokio_fix_initiator example is broken

I would like to try to fix the tokio_fix_initiator example, but I can't--for the life of me--figure out how to implement Backend. Specifically I am getting tripped up on the higher-ranked trait bound for Error (associated type). If you could point me in the right direction, I can hopefully make more progress. I have tried many variations of

impl <'a> fefix::session::Backend for Application<'a> {
   type Error = &'a str;

But I can't figure out how to make the compiler happy.

Thanks.

FEFAST - How to use?

Hi, first of all, thank you very much for your effort on making this library!
Send me your wallet so I can buy you a pizza 🍕 🍺 .

So, I'm trying to use this library to read data from the Brazillian Stock Exchange (B3), but I'm kinda of new in the Wayne's Rust World.

Could you help me pointing out with an example that uses fefast?

Support unsigned 64-bit integers for sequence numbers

Is your feature request related to a problem? Please describe.
Per https://www.fixtrading.org/groups/continuousmkts/
Sequence number resets are a bore.

Describe the solution you'd like
The implementation proposed is to use an unsigned 64 bit integer for a sequence number.

Using 1 billion sequence numbers per second, that will last for 584 years until they run out.

So we can leave the problem to our great, great, great (more) grandchildren to solve!

Describe alternatives you've considered
delete_me

See attached "Continuous Markets WG- 24x7 FIX Best Practise Working Draft_v0.015.docx"
Continuous Markets WG- 24x7 FIX Best Practise Working Draft_v0.015.docx

It looks like the use of usize for the datatype of BeginSeqNum and EndSeqNum in ResendRequest message means that these are 64 bit unsigned integers if complied on any modern 64-bit architecture.

Can you confirm this understanding is correct, that there is no need to change ferrumfix?

How to send message to Acceptor?

Hi there,
I use ferrumfix as a initiator in my program, but I didn't find any functions to send a FIX message to Acceptor? I found on_inbound_message, on_outbound_message of Application, but there are Callback functions those can't use to send message directly.

Appreciate for anyone's help.

Example not working

First of all, thanks for making this library. I'm currently trying to create a FIX engine in rust and this library has been most helpful so far!

I was looking at the examples in but found some of them not working as expected(some even not compiling) such as https://github.com/ferrumfix/ferrumfix/blob/develop/examples/20_tokio_fix_initiator/src/main.rs
It seems that in 0.7.0 fefix::session::FixConnection was removed due to some reason. Would it be possible to know why?

And since fix::session::Backend trait it's genuine trait instead of async_trait, I'm presuming there are specific design patterns for FIX Engines in the future such as creating a socket acceptor in a tokio task and forwarding all messages to a different task via a channel? It would be great to know what you are planning and how I could help!

Thanks again for creating this library!

Decoder fails unexpectedly when reused

The decoder fails to decode FIX messages properly when being reused. One would expect to be able to reuse the decoder indefinetly, however when decoding a message that has group tags the next messages get decoded incorrectly.

A very basic example would be the following:

use fefix::{Dictionary, GetConfig};
use fefix::tagvalue::{Config, Decoder};

let msg_1 = b"8=FIX.4.4|9=000005|35=5|10=152|";
let msg_2 = b"8=FIX.4.4|9=000018|35=A|33=1|58=Test|10=200|";

let mut decoder: Decoder<Config> = Decoder::new(Dictionary::fix44());
decoder.config_mut().set_separator(b'|');

let result = decoder.decode(&msg_1);
println!("{:?}", result.unwrap());
let result = decoder.decode(&msg_2);
println!("{:?}", result.unwrap());
let result = decoder.decode(&msg_1);
println!("{:?}", result.unwrap());

The previous code does not decode msg_1 consistently. It first decodes it correctly but later on somehow splits it into groups as the output of the code shows:

Message { builder: MessageBuilder { state: DecoderState { group_information: [], new_group: None, data_field_length: None }, raw: [], fields: {FieldLocator { tag: 35, context: TopLevel }: (35, [53], 1), FieldLocator { tag: 8, context: TopLevel }: (8, [70, 73, 88, 46, 52, 46, 52], 0)}, field_locators: [FieldLocator { tag: 8, context: TopLevel }, FieldLocator { tag: 35, context: TopLevel }], i_first_cell: 0, i_last_cell: 0, len_end_header: 0, len_end_body: 0, len_end_trailer: 0, bytes: [56, 61, 70, 73, 88, 46, 52, 46, 52, 124, 57, 61, 48, 48, 48, 48, 48, 53, 124, 51, 53, 61, 53, 124, 49, 48, 61, 49, 53, 50, 124] }, phantom: PhantomData<&&[u8; 31]>, field_locator_context: TopLevel }
Message { builder: MessageBuilder { state: DecoderState { group_information: [DecoderGroupState { first_tag_of_every_group_entry: 58, num_entries: 1, current_entry_i: 0, index_of_group_tag: 2 }], new_group: None, data_field_length: None }, raw: [], fields: {FieldLocator { tag: 33, context: TopLevel }: (33, [49], 2), FieldLocator { tag: 8, context: TopLevel }: (8, [70, 73, 88, 46, 52, 46, 52], 0), FieldLocator { tag: 58, context: WithinGroup { index_of_group_tag: 2, entry_index: 0 } }: (58, [84, 101, 115, 116], 3), FieldLocator { tag: 35, context: TopLevel }: (35, [65], 1)}, field_locators: [FieldLocator { tag: 8, context: TopLevel }, FieldLocator { tag: 35, context: TopLevel }, FieldLocator { tag: 33, context: TopLevel }, FieldLocator { tag: 58, context: WithinGroup { index_of_group_tag: 2, entry_index: 0 } }], i_first_cell: 0, i_last_cell: 0, len_end_header: 0, len_end_body: 0, len_end_trailer: 0, bytes: [56, 61, 70, 73, 88, 46, 52, 46, 52, 124, 57, 61, 48, 48, 48, 48, 49, 56, 124, 51, 53, 61, 65, 124, 51, 51, 61, 49, 124, 53, 56, 61, 84, 101, 115, 116, 124, 49, 48, 61, 50, 48, 48, 124] }, phantom: PhantomData<&&[u8; 44]>, field_locator_context: TopLevel }
Message { builder: MessageBuilder { state: DecoderState { group_information: [DecoderGroupState { first_tag_of_every_group_entry: 58, num_entries: 1, current_entry_i: 0, index_of_group_tag: 2 }], new_group: None, data_field_length: None }, raw: [], fields: {FieldLocator { tag: 8, context: WithinGroup { index_of_group_tag: 2, entry_index: 0 } }: (8, [70, 73, 88, 46, 52, 46, 52], 0), FieldLocator { tag: 35, context: WithinGroup { index_of_group_tag: 2, entry_index: 0 } }: (35, [53], 1)}, field_locators: [FieldLocator { tag: 8, context: WithinGroup { index_of_group_tag: 2, entry_index: 0 } }, FieldLocator { tag: 35, context: WithinGroup { index_of_group_tag: 2, entry_index: 0 } }], i_first_cell: 0, i_last_cell: 0, len_end_header: 0, len_end_body: 0, len_end_trailer: 0, bytes: [56, 61, 70, 73, 88, 46, 52, 46, 52, 124, 57, 61, 48, 48, 48, 48, 48, 53, 124, 51, 53, 61, 53, 124, 49, 48, 61, 49, 53, 50, 124] }, phantom: PhantomData<&&[u8; 31]>, field_locator_context: TopLevel }

It would be nice if the decoder either cleans its state before parsing a new message, or becomes entirely stateless although I'm not sure if possible.

Parser panics when tag contains non-digit

Describe the bug
The parser panics when it encounters certain kinds of invalid input.

To Reproduce

use fefix::prelude::*;
use fefix::tagvalue::Decoder;

fn main() {
    let bytes = b"8=FIX.4.2|9=10|3/=X|49=A|10=171|";
    //                            ^                                                                                                                                      
    //                            |                                                                                                                                      
    //           Not a digit -----+                                                                                                                                      

    let mut fix_decoder = Decoder::new(Dictionary::fix42());
    fix_decoder.config_mut().separator = b'|';

    let _ = fix_decoder.decode(bytes);
}

This panics

thread 'main' panicked at /home/schubart/projects/ferrumfix/crates/fefix/src/tagvalue/decoder.rs:164:38:
attempt to subtract with overflow
stack backtrace:
   0: rust_begin_unwind
             at /rustc/7cf61ebde7b22796c69757901dd346d0fe70bd97/library/std/src/panicking.rs:647:5
   1: core::panicking::panic_fmt
             at /rustc/7cf61ebde7b22796c69757901dd346d0fe70bd97/library/core/src/panicking.rs:72:14
   2: core::panicking::panic
             at /rustc/7cf61ebde7b22796c69757901dd346d0fe70bd97/library/core/src/panicking.rs:144:5
   3: fefix::tagvalue::decoder::Decoder::from_frame
             at /home/schubart/projects/ferrumfix/crates/fefix/src/tagvalue/decoder.rs:164:38
   4: fefix::tagvalue::decoder::Decoder::decode
             at /home/schubart/projects/ferrumfix/crates/fefix/src/tagvalue/decoder.rs:114:9
   5: example_decode_fix::main
             at ./src/main.rs:13:13
   6: core::ops::function::FnOnce::call_once
             at /rustc/7cf61ebde7b22796c69757901dd346d0fe70bd97/library/core/src/ops/function.rs:250:5

in the following FerrumFIX code:

                for byte in payload[i..index_of_next_equal_sign].iter().copied() {
                    tag = tag * 10 + (byte as u32 - b'0' as u32);
                }

Expected behavior
decode returns an Err result.

Compile errors

thanks for help!

Environment:
branch:develop
cargo -V
cargo 1.60.0 (d1fd9fe2c 2022-03-01)

errors:
53 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapOk<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapOk<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:48:1
|
48 | / delegate_all!(
49 | | /// Stream for the map_ok method.
50 | | MapOk<St, F>(
51 | | Map<IntoStream, MapOkFn>
52 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_ok_fn(f))]
53 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapOk<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapOk<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:48:1
|
48 | / delegate_all!(
49 | | /// Stream for the map_ok method.
50 | | MapOk<St, F>(
51 | | Map<IntoStream, MapOkFn>
52 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_ok_fn(f))]
53 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapOk<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapOk<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:48:1
|
48 | / delegate_all!(
49 | | /// Stream for the map_ok method.
50 | | MapOk<St, F>(
51 | | Map<IntoStream, MapOkFn>
52 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_ok_fn(f))]
53 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapErr<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut try_stream::MapErr<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:55:1
|
55 | / delegate_all!(
56 | | /// Stream for the map_err method.
57 | | MapErr<St, F>(
58 | | Map<IntoStream, MapErrFn>
59 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_err_fn(f))]
60 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapErr<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:124:18
|
124 | self.project().$field.poll_next(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapErr<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:55:1
|
55 | / delegate_all!(
56 | | /// Stream for the map_err method.
57 | | MapErr<St, F>(
58 | | Map<IntoStream, MapErrFn>
59 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_err_fn(f))]
60 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_stream (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapErr<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapErr<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:55:1
|
55 | / delegate_all!(
56 | | /// Stream for the map_err method.
57 | | MapErr<St, F>(
58 | | Map<IntoStream, MapErrFn>
59 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_err_fn(f))]
60 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapErr<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapErr<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:55:1
|
55 | / delegate_all!(
56 | | /// Stream for the map_err method.
57 | | MapErr<St, F>(
58 | | Map<IntoStream, MapErrFn>
59 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_err_fn(f))]
60 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapErr<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapErr<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:55:1
|
55 | / delegate_all!(
56 | | /// Stream for the map_err method.
57 | | MapErr<St, F>(
58 | | Map<IntoStream, MapErrFn>
59 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_err_fn(f))]
60 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::MapErr<St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::MapErr<St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/mod.rs:55:1
|
55 | / delegate_all!(
56 | | /// Stream for the map_err method.
57 | | MapErr<St, F>(
58 | | Map<IntoStream, MapErrFn>
59 | | ): Debug + Sink + Stream + FusedStream + AccessInner[St, (. .)] + New[|x: St, f: F| Map::new(IntoStream::new(x), map_err_fn(f))]
60 | | );
| |_- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut or_else::OrElse<St, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut or_else::OrElse<St, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/or_else.rs:43:5
|
43 | delegate_access_inner!(stream, St, ());
| -------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut or_else::OrElse<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut or_else::OrElse<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/or_else.rs:105:5
|
105 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut or_else::OrElse<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut or_else::OrElse<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/or_else.rs:105:5
|
105 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut or_else::OrElse<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut or_else::OrElse<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/or_else.rs:105:5
|
105 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut or_else::OrElse<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut or_else::OrElse<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/or_else.rs:105:5
|
105 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilter<St, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut TryFilter<St, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter.rs:52:5
|
52 | delegate_access_inner!(stream, St, ());
| -------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilter<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut TryFilter<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter.rs:113:5
|
113 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilter<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut TryFilter<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter.rs:113:5
|
113 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilter<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut TryFilter<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter.rs:113:5
|
113 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilter<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut TryFilter<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter.rs:113:5
|
113 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilterMap<St, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut TryFilterMap<St, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter_map.rs:40:5
|
40 | delegate_access_inner!(stream, St, ());
| -------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilterMap<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut TryFilterMap<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter_map.rs:103:5
|
103 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilterMap<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut TryFilterMap<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter_map.rs:103:5
|
103 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilterMap<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut TryFilterMap<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter_map.rs:103:5
|
103 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryFilterMap<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut TryFilterMap<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_filter_map.rs:103:5
|
103 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::try_flatten::TryFlatten<St>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut try_stream::try_flatten::TryFlatten<St>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_flatten.rs:32:5
|
32 | delegate_access_inner!(stream, St, ());
| -------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::try_flatten::TryFlatten<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::try_flatten::TryFlatten<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_flatten.rs:81:5
|
81 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::try_flatten::TryFlatten<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut try_stream::try_flatten::TryFlatten<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_flatten.rs:81:5
|
81 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::try_flatten::TryFlatten<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::try_flatten::TryFlatten<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_flatten.rs:81:5
|
81 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut try_stream::try_flatten::TryFlatten<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut try_stream::try_flatten::TryFlatten<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_flatten.rs:81:5
|
81 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TrySkipWhile<St, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut TrySkipWhile<St, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_skip_while.rs:55:5
|
55 | delegate_access_inner!(stream, St, ());
| -------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TrySkipWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut TrySkipWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_skip_while.rs:122:5
|
122 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TrySkipWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut TrySkipWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_skip_while.rs:122:5
|
122 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TrySkipWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut TrySkipWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_skip_while.rs:122:5
|
122 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TrySkipWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut TrySkipWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_skip_while.rs:122:5
|
122 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryTakeWhile<St, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut TryTakeWhile<St, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_take_while.rs:59:5
|
59 | delegate_access_inner!(stream, St, ());
| -------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryTakeWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut TryTakeWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_take_while.rs:132:5
|
132 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryTakeWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut TryTakeWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_take_while.rs:132:5
|
132 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryTakeWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut TryTakeWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_take_while.rs:132:5
|
132 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryTakeWhile<S, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut TryTakeWhile<S, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_take_while.rs:132:5
|
132 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBufferUnordered<St>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffer_unordered.rs:50:29
|
50 | let mut this = self.project();
| ^^^^^^^ method not found in Pin<&mut TryBufferUnordered<St>>

error[E0599]: no method named project found for struct Pin<&mut TryBuffered<St>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffered.rs:53:29
|
53 | let mut this = self.project();
| ^^^^^^^ method not found in Pin<&mut TryBuffered<St>>

error[E0599]: no method named project found for struct Pin<&mut TryForEachConcurrent<St, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_for_each_concurrent.rs:72:29
|
72 | let mut this = self.project();
| ^^^^^^^ method not found in Pin<&mut TryForEachConcurrent<St, Fut, F>>

error[E0599]: no method named project found for struct Pin<&mut TryBufferUnordered<St>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut TryBufferUnordered<St>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffer_unordered.rs:37:5
|
37 | delegate_access_inner!(stream, St, (. .));
| ----------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBufferUnordered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut TryBufferUnordered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffer_unordered.rs:84:5
|
84 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBufferUnordered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut TryBufferUnordered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffer_unordered.rs:84:5
|
84 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBufferUnordered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut TryBufferUnordered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffer_unordered.rs:84:5
|
84 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBufferUnordered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut TryBufferUnordered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffer_unordered.rs:84:5
|
84 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBuffered<St>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut TryBuffered<St>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffered.rs:39:5
|
39 | delegate_access_inner!(stream, St, (. .));
| ----------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBuffered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut TryBuffered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffered.rs:88:5
|
88 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBuffered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut TryBuffered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffered.rs:88:5
|
88 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBuffered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut TryBuffered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffered.rs:88:5
|
88 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut TryBuffered<S>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut TryBuffered<S>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/try_stream/try_buffered.rs:88:5
|
88 | delegate_sink!(stream, Item);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut OrderWrapper<T>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/stream/futures_ordered.rs:52:14
|
52 | self.project().data.poll(cx)
| ^^^^^^^ method not found in Pin<&mut OrderWrapper<T>>

error[E0599]: no method named project found for struct Pin<&mut SinkErrInto<Si, Item, E>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut SinkErrInto<Si, Item, E>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/err_into.rs:25:5
|
25 | delegate_access_inner!(sink, Si, (.));
| ------------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkErrInto<Si, Item, E>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:81:18
|
81 | self.project().$field.poll_ready(cx)
| ^^^^^^^ method not found in Pin<&mut SinkErrInto<Si, Item, E>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/err_into.rs:34:5
|
34 | delegate_sink!(sink, Item);
| -------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkErrInto<Si, Item, E>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:88:18
|
88 | self.project().$field.start_send(item)
| ^^^^^^^ method not found in Pin<&mut SinkErrInto<Si, Item, E>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/err_into.rs:34:5
|
34 | delegate_sink!(sink, Item);
| -------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkErrInto<Si, Item, E>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:95:18
|
95 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut SinkErrInto<Si, Item, E>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/err_into.rs:34:5
|
34 | delegate_sink!(sink, Item);
| -------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkErrInto<Si, Item, E>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:102:18
|
102 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut SinkErrInto<Si, Item, E>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/err_into.rs:34:5
|
34 | delegate_sink!(sink, Item);
| -------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_sink (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkErrInto<S, Item, E>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:124:18
|
124 | self.project().$field.poll_next(cx)
| ^^^^^^^ method not found in Pin<&mut SinkErrInto<S, Item, E>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/err_into.rs:44:5
|
44 | delegate_stream!(sink);
| ---------------------- in this macro invocation
|
= note: this error originates in the macro delegate_stream (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkMapErr<Si, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut SinkMapErr<Si, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/map_err.rs:22:5
|
22 | delegate_access_inner!(sink, Si, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut SinkMapErr<S, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:124:18
|
124 | self.project().$field.poll_next(cx)
| ^^^^^^^ method not found in Pin<&mut SinkMapErr<S, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/map_err.rs:68:5
|
68 | delegate_stream!(sink);
| ---------------------- in this macro invocation
|
= note: this error originates in the macro delegate_stream (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut With<S, Item, U, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:124:18
|
124 | self.project().$field.poll_next(cx)
| ^^^^^^^ method not found in Pin<&mut With<S, Item, U, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/with.rs:62:5
|
62 | delegate_stream!(sink);
| ---------------------- in this macro invocation
|
= note: this error originates in the macro delegate_stream (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut With<Si, Item, U, Fut, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut With<Si, Item, U, Fut, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/with.rs:71:5
|
71 | delegate_access_inner!(sink, Si, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut WithFlatMap<Si, Item, U, St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut WithFlatMap<Si, Item, U, St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/with_flat_map.rs:53:5
|
53 | delegate_access_inner!(sink, Si, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut WithFlatMap<S, Item, U, St, F>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:124:18
|
124 | self.project().$field.poll_next(cx)
| ^^^^^^^ method not found in Pin<&mut WithFlatMap<S, Item, U, St, F>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/with_flat_map.rs:91:5
|
91 | delegate_stream!(sink);
| ---------------------- in this macro invocation
|
= note: this error originates in the macro delegate_stream (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut Buffer<Si, Item>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut Buffer<Si, Item>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/sink/buffer.rs:30:5
|
30 | delegate_access_inner!(sink, Si, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_reader::BufReader<R>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut buf_reader::BufReader<R>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_reader.rs:61:5
|
61 | delegate_access_inner!(inner, R, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_reader::BufReader<R>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:139:18
|
139 | self.project().$field.poll_write(cx, buf)
| ^^^^^^^ method not found in Pin<&mut buf_reader::BufReader<R>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_reader.rs:148:5
|
148 | delegate_async_write!(inner);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_write (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_reader::BufReader<R>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:144:18
|
144 | self.project().$field.poll_write_vectored(cx, bufs)
| ^^^^^^^ method not found in Pin<&mut buf_reader::BufReader<R>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_reader.rs:148:5
|
148 | delegate_async_write!(inner);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_write (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_reader::BufReader<R>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:149:18
|
149 | self.project().$field.poll_flush(cx)
| ^^^^^^^ method not found in Pin<&mut buf_reader::BufReader<R>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_reader.rs:148:5
|
148 | delegate_async_write!(inner);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_write (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_reader::BufReader<R>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:154:18
|
154 | self.project().$field.poll_close(cx)
| ^^^^^^^ method not found in Pin<&mut buf_reader::BufReader<R>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_reader.rs:148:5
|
148 | delegate_async_write!(inner);
| ---------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_write (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_writer::BufWriter<W>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut buf_writer::BufWriter<W>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_writer.rs:82:5
|
82 | delegate_access_inner!(inner, W, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_writer::BufWriter<W>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:171:18
|
171 | self.project().$field.poll_read(cx, buf)
| ^^^^^^^ method not found in Pin<&mut buf_writer::BufWriter<W>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_writer.rs:134:5
|
134 | delegate_async_read!(inner);
| --------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_read (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_writer::BufWriter<W>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:177:18
|
177 | self.project().$field.poll_read_vectored(cx, bufs)
| ^^^^^^^ method not found in Pin<&mut buf_writer::BufWriter<W>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_writer.rs:134:5
|
134 | delegate_async_read!(inner);
| --------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_read (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_writer::BufWriter<W>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:190:18
|
190 | self.project().$field.poll_fill_buf(cx)
| ^^^^^^^ method not found in Pin<&mut buf_writer::BufWriter<W>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_writer.rs:138:5
|
138 | delegate_async_buf_read!(inner);
| ------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_buf_read (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut buf_writer::BufWriter<W>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:194:18
|
194 | self.project().$field.consume(amt)
| ^^^^^^^ method not found in Pin<&mut buf_writer::BufWriter<W>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/buf_writer.rs:138:5
|
138 | delegate_async_buf_read!(inner);
| ------------------------------- in this macro invocation
|
= note: this error originates in the macro delegate_async_buf_read (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no method named project found for struct Pin<&mut io::take::Take<R>> in the current scope
--> /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/lib.rs:222:18
|
222 | self.project().$field $($ind get_pin_mut())*
| ^^^^^^^ method not found in Pin<&mut io::take::Take<R>>
|
::: /Users/admin/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-util-0.3.8/src/io/take.rs:82:5
|
82 | delegate_access_inner!(inner, R, ());
| ------------------------------------ in this macro invocation
|
= note: this error originates in the macro delegate_access_inner (in Nightly builds, run with -Z macro-backtrace for more info)

Some errors have detailed explanations: E0422, E0433, E0599, E0786.
For more information about an error, try rustc --explain E0422.
error: build failed
The terminal process "cargo 'build'" terminated with exit code: 101.

Terminal will be reused by tasks, press any key to close it.

00_decode_fix repeating group assertions failing

Describe the bug
Hi, currently looking into FIX serializers/deserializers in rust and was messing around with the examples. Noticed that the assertions on the repeating groups all fail. The FIX header parsing seems to work fine, and as soon as it starts trying to look at

  for entry in md_entries.entries() {
        assert_eq!(entry.fv(fix42::CURRENCY), Ok(b"EUR"));
    }

Every assertion including the above start turning up with Err(None). Running this on rust stable.

To Reproduce

  1. Cd into 00_decode_fix
  2. cargo run

Expected behavior
The assertions pass

Screenshots
Logs:

    Finished dev [unoptimized + debuginfo] target(s) in 0.19s
     Running `/Users/gray/bin/wolf/ferrumfix/target/debug/example_decode_fix`
thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `Err(None)`,
 right: `Ok([69, 85, 82])`', examples/00_decode_fix/src/main.rs:41:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace```

RUSTSEC-2020-0071: Potential segfault in the time crate

Potential segfault in the time crate

Details
Package time
Version 0.1.45
URL time-rs/time#293
Date 2020-11-18
Patched versions >=0.2.23
Unaffected versions =0.2.0,=0.2.1,=0.2.2,=0.2.3,=0.2.4,=0.2.5,=0.2.6

Impact

Unix-like operating systems may segfault due to dereferencing a dangling pointer in specific circumstances. This requires an environment variable to be set in a different thread than the affected functions. This may occur without the user's knowledge, notably in a third-party library.

The affected functions from time 0.2.7 through 0.2.22 are:

  • time::UtcOffset::local_offset_at
  • time::UtcOffset::try_local_offset_at
  • time::UtcOffset::current_local_offset
  • time::UtcOffset::try_current_local_offset
  • time::OffsetDateTime::now_local
  • time::OffsetDateTime::try_now_local

The affected functions in time 0.1 (all versions) are:

  • at
  • at_utc
  • now

Non-Unix targets (including Windows and wasm) are unaffected.

Patches

Pending a proper fix, the internal method that determines the local offset has been modified to always return None on the affected operating systems. This has the effect of returning an Err on the try_* methods and UTC on the non-try_* methods.

Users and library authors with time in their dependency tree should perform cargo update, which will pull in the updated, unaffected code.

Users of time 0.1 do not have a patch and should upgrade to an unaffected version: time 0.2.23 or greater or the 0.3 series.

Workarounds

No workarounds are known.

See advisory page for additional details.

Parser panics when value of a length tag exceeds message

Describe the bug
The parser panics when it encounters certain kinds of invalid input.

To Reproduce

use fefix::prelude::*;
use fefix::tagvalue::Decoder;

fn main() {
    //         A length field ----+                                                                                                                                      
    //                            |                                                                                                                                      
    //                           vv                                                                                                                                      
    let bytes = b"8=FIX.4.2|9=12|95=333|49=A|10=171|";
    //                              ^^^                                                                                                                                  
    //                               |                                                                                                                                   
    //           Not enough bytes ---+                                                                                                                                   
    let mut fix_decoder = Decoder::new(Dictionary::fix42());
    fix_decoder.config_mut().separator = b'|';

    let _ = fix_decoder.decode(bytes);
}

This panics when parsing tag 49

thread 'main' panicked at crates/fefix/src/tagvalue/decoder.rs:200:60:
range end index 333 out of range for slice of length 2
stack backtrace:
   0: rust_begin_unwind
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/std/src/panicking.rs:646:5
   1: core::panicking::panic_fmt
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/panicking.rs:72:14
   2: core::slice::index::slice_end_index_len_fail_rt
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/slice/index.rs:66:5
   3: core::slice::index::slice_end_index_len_fail
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/slice/index.rs:59:5
   4: <core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/slice/index.rs:401:13
   5: <core::ops::range::RangeTo<usize> as core::slice::index::SliceIndex<[T]>>::index
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/slice/index.rs:448:9
   6: core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/slice/index.rs:18:9
   7: fefix::tagvalue::decoder::Decoder::store_field
             at /home/schubart/projects/ferrumfix/crates/fefix/src/tagvalue/decoder.rs:200:60
   8: fefix::tagvalue::decoder::Decoder::from_frame
             at /home/schubart/projects/ferrumfix/crates/fefix/src/tagvalue/decoder.rs:175:13
   9: fefix::tagvalue::decoder::Decoder::decode
             at /home/schubart/projects/ferrumfix/crates/fefix/src/tagvalue/decoder.rs:114:9
  10: example_decode_fix::main
             at ./src/main.rs:15:13
  11: core::ops::function::FnOnce::call_once
             at /rustc/c9f8f3438a8134a413aa5d4903e0196e44e37bbc/library/core/src/ops/function.rs:250:5

in the following FerrumFIX code:

        let field_value = &raw_message[field_value_start..][..field_value_len];

Expected behavior
decode returns an Err result.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.