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 104 105 106 107 108 109 110
extern crate proc_macro2; use quote::quote; use std::{fs::OpenOptions, process::Command}; use std::io::prelude::*; mod types; mod compile; use crate::compile::compile_cdp_json; pub fn init() { let mut file = OpenOptions::new() .append(true) .create(true) .open(format!("./src/protocol.rs")) .unwrap(); file.sync_all().unwrap(); if file.metadata().unwrap().len() <= 0 { let (js_mods,js_events) = compile_cdp_json("./js_protocol.json"); let (browser_mods,browser_events) = compile_cdp_json("./browser_protocol.json"); let modv = quote! { pub mod cdp { pub mod types { use serde::{Deserialize, Serialize}; use std::fmt::Debug; pub type JsInt = i32; pub type JsUInt = u32; pub type WindowId = JsUInt; pub type CallId = JsUInt; #[derive(Serialize, Debug)] pub struct MethodCall<T> where T: Debug, { #[serde(rename = "method")] method_name: &'static str, pub id: CallId, params: T, } impl<T> MethodCall<T> where T: Debug, { pub fn get_params(&self) -> &T { &self.params } } pub trait Method: Debug { const NAME: &'static str; type ReturnObject: serde::de::DeserializeOwned + std::fmt::Debug; fn to_method_call(self, call_id: CallId) -> MethodCall<Self> where Self: std::marker::Sized, { MethodCall { id: call_id, params: self, method_name: Self::NAME, } } } #[derive(Deserialize, Debug, Clone, PartialEq)] #[serde(tag = "method")] #[allow(clippy::large_enum_variant)] pub enum BrowserEvent { #(#browser_events)* } #[derive(Deserialize, Debug, Clone, PartialEq)] #[serde(tag = "method")] #[allow(clippy::large_enum_variant)] pub enum JsEvent { #(#js_events)* } } #(#js_mods)* #(#browser_mods)* } }; writeln!(file, "{}", modv.to_string()).unwrap(); Command::new("rustfmt") .arg("./src/protocol.rs") .output() .unwrap(); } }