Skip to content

Instantly share code, notes, and snippets.

@Marwes
Forked from Xanewok/main.rs
Last active July 4, 2017 15:30
Show Gist options
  • Save Marwes/93a5d9530226e5404493000d653db979 to your computer and use it in GitHub Desktop.
Save Marwes/93a5d9530226e5404493000d653db979 to your computer and use it in GitHub Desktop.
extern crate languageserver_types as ls_types;
pub trait Request {
type Param;
type Result;
// Has to be a method as associated constants are unstable
fn method(&self) -> &'static str;
}
struct RequestStruct<Params> {
id: ls_types::NumberOrString,
params: Params
}
impl Request for ls_types::ShowMessageRequestParams> {
type Param = ls_types::ShowMessageRequestParams;
type Result = ls_types::MessageActionItem;
fn method(&self) -> &'static str { ls_types::REQUEST__ShowMessageRequest }
}
// Example separated request handling logic
trait RequestHandler<R: Request> {
fn handle(&self, request: RequestStruct<R>) -> R::Result;
}
struct MyHandler;
impl RequestHandler<ShowMessageRequest> for MyHandler {
fn handle(&self, request: RequestStruct<ShowMessageRequest>) -> ls_types::MessageActionItem {
eprintln!("Handling ShowMessageRequest");
ls_types::MessageActionItem { title: String::from("dummy") }
}
}
fn main() {
let handler = MyHandler;
let request = ShowMessageRequest {
id: ls_types::NumberOrString::Number(1),
params: ls_types::ShowMessageRequestParams {
typ: ls_types::MessageType::Info,
message: String::from("Hello!"),
actions: None
}
};
handler.handle(request);
type MyRequest = RequestStruct<String>;
let request = MyRequest {
id: ls_types::NumberOrString::Number(1),
params: String::from("dummy")
};
// handler.handle(request); //ERROR: trait bound is not satisfied
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment