Rust 的链式编程

rust 复制代码
mod protocol_crate;
use protocol_crate::protocol::IspPacketsInfo;
use std::net::UdpSocket;
use std::thread::sleep;
use std::time::Duration;
use chrono;

fn main() {
    let tmp = IspPacketsInfo{
        start:0x7E,
        ap_layer:0x3E,
        vp_layer:0x4E
    };
    let buffer = [tmp.start,tmp.ap_layer,tmp.vp_layer];
    for a in buffer {
        print!("{:02x} ",a);
    }
    let socket = UdpSocket::bind("0.0.0.0:9090").expect("Can't bind ip address or port");
    println!();
    let mut buffer = [0u8;1500];
    let mut recv_size:usize;
    let mut src;
    let mut slice:&[u8];
    let mut ascii_str:String;
    let mut snd_buffer:String;
    loop {
        sleep(Duration::from_secs(1));
        (recv_size,src)  = socket.recv_from(&mut buffer).expect("recv from buffer error");
        slice = &buffer[0 .. recv_size];
        ascii_str = String::from_utf8_lossy(slice).parse().unwrap();
        println!("[ {}] Recv:{:?} Size:{} RecvBuffer:{:?}",chrono::Local::now().format
        ("%Y-%m-%d %H:%M:%S"),
                 src,recv_size,
            ascii_str);
        snd_buffer = "Rust:".to_owned() + &*ascii_str;
        socket.send_to(snd_buffer.as_bytes(), src).expect("send buffer error");
        snd_buffer.clear();
        buffer.iter_mut().for_each(|x| *x=0);
    };
}

升级版本

rust 复制代码
mod protocol_crate;
use protocol_crate::protocol::IspPacketsInfo;
use std::net::UdpSocket;
use std::process::exit;
use std::thread::sleep;
use std::time::Duration;
use chrono;

fn main() {
    let tmp = IspPacketsInfo{
        start:0x7E,
        ap_layer:0x3E,
        vp_layer:0x4E
    };
    let buffer = [tmp.start,tmp.ap_layer,tmp.vp_layer];
    for a in buffer {
        print!("{:02x} ",a);
    }
    let socket = UdpSocket::bind("0.0.0.0:9090");
    let _safe_socket:UdpSocket;
    if let Ok(_safe_socket) = socket {
        let socket = &_safe_socket;
        println!();
        let mut buffer = [0u8; 1500];
        let mut snd_buffer: String = Default::default();
        loop {
            sleep(Duration::from_secs(1));
            if let Err(err) = socket.recv_from(&mut buffer).map(|(recv_size,src)| {
                if let Ok(ascii_str) = String::from_utf8_lossy(&buffer[0..recv_size])
                    .parse::<String>() {
                println!("[ {}] Recv:{:?} Size:{} RecvBuffer:{:?}", chrono::Local::now().format
                ("%Y-%m-%d %H:%M:%S"),
                         src, recv_size,
                         ascii_str);
                snd_buffer = "Rust:".to_owned() + &*ascii_str;
                if let Err(error) = socket.send_to(snd_buffer.as_bytes(), src)
                {
                    print!("error:{}",error);
                }else {
                    snd_buffer.clear();
                }}}){
                print!("RecvError:{}",err);
            }
        };
    }else {
        if let Some(error) = socket.err() {
            print!("{}",error);
            exit(1);
        }
    }
}

Rust 安全来自 Result 和 Some

就是写的时候会累一些, 不写原型和特性直接用没啥问题

不适用内存对齐的方式解码也很累,为了安全其实也能忍

减少unsafe 的作用域的使用

rust 复制代码
use rusqlite::{Connection, Result, params, Error};
use std::collections::HashMap;
use std::fmt;

#[derive(Debug)]
pub struct Table{
   pub class:String,
   pub name:String,
   pub tbl_name:String,
   pub root_page:i32,
   pub sql:String
}

#[derive(Debug)]
pub struct RepeaterDevTable{
    id:u32,
    name:String,
}

#[derive(Debug)]
pub struct Sqlite<'a>{
    db_path :&'a str,
    tb_name :&'a str,
    connection: Connection,
    tb_list :Vec<Table>,
    hash_map: HashMap<u32,RepeaterDevTable>
}

impl<'a> Sqlite<'a> {
    pub fn new(db_name:&'a str, table_name:&'a str) -> Result<Box<Self>> {
        match Connection::open(db_name) {
            Ok(con) => {
                    Ok(Box::new(Sqlite{db_path:db_name,tb_name:table_name,connection:con,
                        tb_list:Default::default(),hash_map:HashMap::new()}))
            },
            Err(err) => {
                Err(err)
            }
        } }
    pub fn setup(&mut self) -> Result<()> {
        if let Err(err) = self.connection.prepare("SELECT * FROM sqlite_master").map(|mut stmt|{
            let query_table = stmt.query_map([],|row|{
                Ok(Table{
                    class: row.get(0).unwrap(),
                    name: row.get(1).unwrap(),
                    tbl_name: row.get(2).unwrap(),
                    root_page: row.get(3).unwrap(),
                    sql:row.get(4).unwrap()
                })
            });
            if let Ok(table_iter) = query_table {
                for it in table_iter {
                    if let Ok(_it) = it {
                        self.tb_list.push(_it);
                    }
                }
            }
            if let Err(err) = self.connection.prepare(format!("SELECT * FROM {}",self
                .tb_name).as_str()).map(|mut stmt|{
             let _query_table = stmt.query_map([],|row|{
                Ok(RepeaterDevTable{
                    id: row.get(0).unwrap(),
                    name: row.get(1).unwrap(),
                })
            });
            if let Ok(table_iter) = _query_table {
                for it in table_iter {
                    if let Ok(_it) = it {
                        self.hash_map.insert(_it.id,_it);
                    }
                }
            }
            }) {
            }
        }){
            return Err(err);
        }
        Ok(())
    }
    pub fn list_table(&self) -> &Vec<Table>{
        &self.tb_list
    }

    pub fn query(&'a self, index:u32) -> Option<&'a RepeaterDevTable> {
        match self.hash_map.get(&index) {
            None => {
                None
            }
            Some(v) => {
                Option::from(v)
            }
        }
    }
}

简易开发还是okay的,生命周期加所有权,还是得多留意

这些足够开发一个可玩性高的GUI 服务的后端的上位机了,告一段落,越复杂的特性,后期带来的回报越大

Rust 版本的OMC 程序 有搞头的,Python 版本和 C++ 版本 都不太如意,Rust 目前还可以

JetBrains 编码不太好用,但是提示修改,一级棒 ,我都熟练CTR-P CTR-N 来代替TAB了,还是没neovim 好用,neovim rust 的提示没有JetBrains 全面

相关推荐
不做超级小白1 分钟前
深入理解 JavaScript 对象字面量:创建对象的简洁方法
开发语言·javascript·ecmascript
我曾经是个程序员2 分钟前
C#集合排序的三种方法(List<T>.Sort、LINQ 的 OrderBy、IComparable<T> 接口)
开发语言·c#
半夏知半秋23 分钟前
rust学习-rust中的格式化打印
服务器·开发语言·后端·学习·rust
handsomestWei29 分钟前
springboot使用tomcat浅析
spring boot·后端·tomcat
SmallBambooCode37 分钟前
【Flask】在Flask应用中使用Flask-Limiter进行简单CC攻击防御
后端·python·flask
IU宝1 小时前
vector的使用,以及部分功能的模拟实现(C++)
开发语言·c++
wang_yb1 小时前
Rust多线程中安全的使用变量
rust·databook
小熊科研路(同名GZH)1 小时前
【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图
开发语言·matlab·信息可视化
&白帝&1 小时前
JAVA JDK7时间相关类
java·开发语言·python
geovindu1 小时前
Qt Designer and Python: Build Your GUI
开发语言·qt