-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.rs
93 lines (83 loc) · 2.46 KB
/
build.rs
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
use std::{
env,
fs::{self, File},
io::Write,
path::Path,
};
const CLIENT_MOD: &str = r#"
#[path = ""]
pub mod client {
#[path = ""]
pub mod iotics {
#[path = "iotics.api.rs"]
pub mod api;
}
#[path = ""]
pub mod google {
#[path = "google.rpc.rs"]
pub mod rpc;
#[path = "google.protobuf.rs"]
pub mod protobuf;
}
}
"#;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// types that needs to get the serde attributes
let types_to_derive = vec![
"Uri",
"StringLiteral",
"LangLiteral",
"Literal",
"Property",
"Property.value",
"GeoLocation",
"GeoCircle",
"Value",
"TwinID",
"FeedID",
"InputID",
"Feed",
"Input",
"UpsertFeedWithMeta",
"UpsertInputWithMeta",
"SearchRequest.Payload.Filter",
"SearchResponse.TwinDetails",
"SearchResponse.FeedDetails",
"SearchResponse.InputDetails",
".google.protobuf.Timestamp",
"protobuf.StringValue",
];
let derive_ser_der = "#[derive(serde::Serialize, serde::Deserialize)]#[serde(rename_all(serialize = \"camelCase\", deserialize = \"camelCase\"))]";
// setup the out folder
let out_dir = env::var("OUT_DIR").expect("Failed get OUT_DIR.");
let client_path = Path::new(&out_dir).join("client");
let _ = fs::remove_dir_all(&client_path);
fs::create_dir(&client_path)?;
// generate the client mod
let mod_path = client_path.join("mod.rs");
let mut mod_file = File::create(mod_path)?;
mod_file.write_all(CLIENT_MOD.as_bytes())?;
// configure the builder
let mut builder = tonic_build::configure()
.out_dir(&client_path)
.build_server(false)
.compile_well_known_types(true);
for type_to_derive in types_to_derive {
builder = builder.type_attribute(type_to_derive, derive_ser_der);
}
builder.compile(
&[
"proto/google/rpc/status.proto",
"api/proto/iotics/api/common.proto",
"api/proto/iotics/api/feed.proto",
"api/proto/iotics/api/host.proto",
"api/proto/iotics/api/input.proto",
"api/proto/iotics/api/interest.proto",
"api/proto/iotics/api/meta.proto",
"api/proto/iotics/api/search.proto",
"api/proto/iotics/api/twin.proto",
],
&["api/proto", "proto"],
)?;
Ok(())
}