gpsd_proto 1.0.0

The gpsd_proto module contains types and functions to connect to gpsd to get GPS coordinates and satellite information.
Documentation
#[macro_use]
extern crate log;

use futures::{future::ready, prelude::*};
use gpsd_proto::UnifiedResponse;
use std::error::Error;
use std::net::SocketAddr;
use tokio::net::TcpStream;
use tokio_util::codec::{Framed, LinesCodec};

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn Error>> {
    env_logger::init();
    info!("Starting");

    let addr: SocketAddr = "127.0.0.1:2947".parse().unwrap();

    let stream = TcpStream::connect(&addr).await?;
    let mut framed = Framed::new(stream, LinesCodec::new());

    framed.send(gpsd_proto::ENABLE_WATCH_CMD).await?;
    framed
        .try_for_each(|line| {
            trace!("Raw {line}");

            match serde_json::from_str(&line) {
                Ok(rd) => match rd {
                    UnifiedResponse::Version(v) => {
                        if v.proto_major < gpsd_proto::PROTO_MAJOR_MIN {
                            panic!("Gpsd major version mismatch");
                        }
                        info!("Gpsd version {} connected", v.rev);
                    }
                    UnifiedResponse::Devices(_) => {}
                    UnifiedResponse::Watch(_) => {}
                    UnifiedResponse::Device(d) => debug!("Device {d:?}"),
                    UnifiedResponse::Tpv(t) => debug!("Tpv {t:?}"),
                    UnifiedResponse::Sky(s) => debug!("Sky {s:?}"),
                    UnifiedResponse::Pps(p) => debug!("PPS {p:?}"),
                    UnifiedResponse::Gst(g) => debug!("GST {g:?}"),
                },
                Err(e) => {
                    error!("Error decoding: {e}");
                }
            };

            ready(Ok(()))
        })
        .await?;

    Ok(())
}