1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
// Copyright 2016 James Bendig. See the COPYRIGHT file at the top-level
// directory of this distribution.
//
// Licensed under:
//   the MIT license
//     <LICENSE-MIT or https://opensource.org/licenses/MIT>
//   or the Apache License, Version 2.0
//     <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>,
// at your option. This file may not be copied, modified, or distributed
// except according to those terms.

#[derive(Clone,Copy,Debug,PartialEq)]
#[allow(non_camel_case_types)]
pub enum MessageVersion { //Based on the ApplVerId(1128) field.
    //Unsupported FIX27,
    //Unsupported FIX30,
    FIX40,
    FIX41,
    FIX42,
    FIX43,
    FIX44,
    FIX50,
    FIX50SP1,
    FIX50SP2,
}

impl MessageVersion {
    pub fn new(value: u32) -> Option<MessageVersion> {
        match value {
            //Unsupported 0 => MessageVersion::FIX27,
            //Unsupported 1 => MessageVersion::FIX30,
            2 => Some(MessageVersion::FIX40),
            3 => Some(MessageVersion::FIX41),
            4 => Some(MessageVersion::FIX42),
            5 => Some(MessageVersion::FIX43),
            6 => Some(MessageVersion::FIX44),
            7 => Some(MessageVersion::FIX50),
            8 => Some(MessageVersion::FIX50SP1),
            9 => Some(MessageVersion::FIX50SP2),
            _ => None,
        }
    }

    pub fn from_bytes(bytes: &[u8]) -> Option<MessageVersion> {
        match bytes {
            //Unsupported b"0" => MessageVersion::FIX27,
            //Unsupported b"1" => MessageVersion::FIX30,
            b"2" => Some(MessageVersion::FIX40),
            b"3" => Some(MessageVersion::FIX41),
            b"4" => Some(MessageVersion::FIX42),
            b"5" => Some(MessageVersion::FIX43),
            b"6" => Some(MessageVersion::FIX44),
            b"7" => Some(MessageVersion::FIX50),
            b"8" => Some(MessageVersion::FIX50SP1),
            b"9" => Some(MessageVersion::FIX50SP2),
            _ => None,
        }
    }

    pub fn as_value(&self) -> u8 {
        match *self {
            //Unsupported MessageVersion::FIX27 => 0,
            //Unsupported MessageVersion::FIX30 => 1,
            MessageVersion::FIX40 => 2,
            MessageVersion::FIX41 => 3,
            MessageVersion::FIX42 => 4,
            MessageVersion::FIX43 => 5,
            MessageVersion::FIX44 => 6,
            MessageVersion::FIX50 => 7,
            MessageVersion::FIX50SP1 => 8,
            MessageVersion::FIX50SP2 => 9,
        }
    }

    pub fn as_bytes(&self) -> &[u8] {
        match *self {
            //Unsupported MessageVersion::FIX27 => b"0",
            //Unsupported MessageVersion::FIX30 => b"1",
            MessageVersion::FIX40 => b"2",
            MessageVersion::FIX41 => b"3",
            MessageVersion::FIX42 => b"4",
            MessageVersion::FIX43 => b"5",
            MessageVersion::FIX44 => b"6",
            MessageVersion::FIX50 => b"7",
            MessageVersion::FIX50SP1 => b"8",
            MessageVersion::FIX50SP2 => b"9",
        }
    }

    pub fn all() -> Vec<MessageVersion> {
        vec![
            MessageVersion::FIX40,
            MessageVersion::FIX41,
            MessageVersion::FIX42,
            MessageVersion::FIX43,
            MessageVersion::FIX44,
            MessageVersion::FIX50,
            MessageVersion::FIX50SP1,
            MessageVersion::FIX50SP2
        ]
    }
}