s7-client 0.1.2

copt protocols
Documentation
use crate::{codec::S7Encoder, error::*};
use bytes::BytesMut;
use copt::CoptFrame;
use s7_comm::ItemRequest;
use tokio_util::codec::Encoder;
use tpkt::TpktFrame;

#[derive(Default)]
pub struct S7ReadBuilder {
    pdu_ref: u16,
    items:   Vec<ItemRequest>
}

impl S7ReadBuilder {
    pub fn pdu_ref(
        mut self,
        pdu_ref: u16
    ) -> Self {
        self.pdu_ref = pdu_ref;
        self
    }

    pub fn add_item(
        mut self,
        item: ItemRequest
    ) -> Self {
        self.items.push(item);
        self
    }

    pub fn read_db_bytes(
        self,
        db_number: u16,
        byte_addr: u16,
        len: u16
    ) -> Self {
        let req = ItemRequest::init_db_byte(
            db_number, byte_addr, 0, len
        );
        self.add_item(req)
    }

    pub fn build(self) -> Result<BytesMut> {
        let mut read_builder =
            s7_comm::Frame::job_read_var(
                self.pdu_ref
            );

        for item in self.items {
            read_builder =
                read_builder.add_item(item);
        }
        let frame = TpktFrame::new(
            CoptFrame::builder_of_dt_data(
                read_builder.build()
            )
            .build(0, true)
        );
        let mut dst = BytesMut::new();
        let mut encoder = S7Encoder::default();
        encoder.encode(frame, &mut dst)?;
        Ok(dst)
    }
}