First steps for Wayland Protocol
This commit is contained in:
commit
1003c8dbc7
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
_build/*
|
||||
protocol/_build/*
|
26
protocol/dune-project
Normal file
26
protocol/dune-project
Normal file
@ -0,0 +1,26 @@
|
||||
(lang dune 3.16)
|
||||
|
||||
(name protocol)
|
||||
|
||||
(generate_opam_files true)
|
||||
|
||||
(source
|
||||
(github username/reponame))
|
||||
|
||||
(authors "Author Name")
|
||||
|
||||
(maintainers "Maintainer Name")
|
||||
|
||||
(license LICENSE)
|
||||
|
||||
(documentation https://url/to/documentation)
|
||||
|
||||
(package
|
||||
(name protocol)
|
||||
(synopsis "A short synopsis")
|
||||
(description "A longer description")
|
||||
(depends ocaml dune)
|
||||
(tags
|
||||
(topics "to describe" your project)))
|
||||
|
||||
; See the complete stanza docs at https://dune.readthedocs.io/en/stable/reference/dune-project/index.html
|
29
protocol/lib/IO.ml
Normal file
29
protocol/lib/IO.ml
Normal file
@ -0,0 +1,29 @@
|
||||
type error = { code : Unix.error ; call : string ; parameter : string }
|
||||
type 'a t = ('a, error) Stdlib.Result.t
|
||||
|
||||
module Operators = struct
|
||||
let ( let* ) (m : 'a t) (f : 'a -> 'b t) : 'b t = Stdlib.Result.bind m f
|
||||
let ( let+ ) (m : 'a t) (f : 'a -> 'b ) : 'b t = Stdlib.Result.map f m
|
||||
let ( ! ) (value : 'a) : 'a t = Stdlib.Result.Ok value
|
||||
end
|
||||
|
||||
let return (value : 'a) : 'a t =
|
||||
Stdlib.Result.Ok value
|
||||
|
||||
let error code call parameter : 'a t =
|
||||
Stdlib.Result.Error { code ; call ; parameter }
|
||||
|
||||
let log { code ; call ; parameter } =
|
||||
Format.fprintf Format.err_formatter
|
||||
"@[<v>During the call %s(%s), the following error occured:@ - %s@ @]"
|
||||
call parameter (Unix.error_message code)
|
||||
|
||||
let recover (io : 'a t) ~using ~on : 'a t =
|
||||
match io with
|
||||
| Ok result -> Ok result
|
||||
| Error e -> log e ; if e.code = on then using else Error e
|
||||
|
||||
let environment_variable (variable : string) : string t =
|
||||
try Ok (Unix.getenv variable) with
|
||||
| Not_found -> error Unix.ENOENT "getenv" variable
|
||||
| Unix.Unix_error (code, call, param) -> error code call param
|
13
protocol/lib/IO.mli
Normal file
13
protocol/lib/IO.mli
Normal file
@ -0,0 +1,13 @@
|
||||
type 'a t
|
||||
|
||||
val return : 'a -> 'a t
|
||||
val error : Unix.error -> string -> string -> 'a t
|
||||
val recover : 'a t -> using:'a t -> on:Unix.error -> 'a t
|
||||
|
||||
val environment_variable : string -> string t
|
||||
|
||||
module Operators : sig
|
||||
val ( let* ) : 'a t -> ('a -> 'b t) -> 'b t
|
||||
val ( let+ ) : 'a t -> ('a -> 'b ) -> 'b t
|
||||
val ( ! ) : 'a -> 'a t
|
||||
end
|
4
protocol/lib/dune
Normal file
4
protocol/lib/dune
Normal file
@ -0,0 +1,4 @@
|
||||
(library
|
||||
(public_name protocol)
|
||||
(libraries unix)
|
||||
(name protocol))
|
37
protocol/lib/socket.ml
Normal file
37
protocol/lib/socket.ml
Normal file
@ -0,0 +1,37 @@
|
||||
type address = Unix.sockaddr
|
||||
type socket = Unix.file_descr
|
||||
|
||||
let create () : socket IO.t =
|
||||
try IO.return Unix.(socket PF_UNIX SOCK_STREAM 0) with
|
||||
| Unix.Unix_error (code, call, param) -> IO.error code call param
|
||||
|
||||
let bind socket address : unit IO.t =
|
||||
try IO.return (Unix.bind socket address) with
|
||||
| Unix.Unix_error (code, call, param) -> IO.error code call param
|
||||
|
||||
let connect socket address : unit IO.t =
|
||||
try IO.return (Unix.connect socket address) with
|
||||
| Unix.Unix_error (code, call, param) -> IO.error code call param
|
||||
|
||||
let listen socket limit : unit IO.t =
|
||||
try IO.return (Unix.listen socket limit) with
|
||||
| Unix.Unix_error (code, call, param) -> IO.error code call param
|
||||
|
||||
let accept socket : socket IO.t =
|
||||
try IO.return (Unix.accept socket |> fst) with
|
||||
| Unix.Unix_error (code, call, param) -> IO.error code call param
|
||||
|
||||
let close socket : unit IO.t =
|
||||
try IO.return (Unix.close socket) with
|
||||
| Unix.Unix_error (code, call, param) -> IO.error code call param
|
||||
|
||||
let address () : address IO.t =
|
||||
let open IO.Operators in
|
||||
let runtime = IO.environment_variable "XDG_RUNTIME_DIR" in
|
||||
let display = IO.environment_variable "WAYLAND_DISPLAY" in
|
||||
let socket = IO.environment_variable "WAYLAND_SOCKET" in
|
||||
let display = IO.recover display ~using:!"wayland-0" ~on:Unix.ENOENT in
|
||||
let concat runtime display = Format.asprintf "%s/%s" runtime display in
|
||||
let fallback = let* runtime in let+ display in concat runtime display in
|
||||
let+ filename = IO.recover socket ~using:fallback ~on:Unix.ENOENT in
|
||||
Unix.ADDR_UNIX filename
|
11
protocol/lib/socket.mli
Normal file
11
protocol/lib/socket.mli
Normal file
@ -0,0 +1,11 @@
|
||||
type socket
|
||||
type address
|
||||
|
||||
val create : unit -> socket IO.t
|
||||
val address : unit -> address IO.t
|
||||
|
||||
val bind : socket -> address -> unit IO.t
|
||||
val connect : socket -> address -> unit IO.t
|
||||
val listen : socket -> int -> unit IO.t
|
||||
val accept : socket -> socket IO.t
|
||||
val close : socket -> unit IO.t
|
31
protocol/protocol.opam
Normal file
31
protocol/protocol.opam
Normal file
@ -0,0 +1,31 @@
|
||||
# This file is generated by dune, edit dune-project instead
|
||||
opam-version: "2.0"
|
||||
synopsis: "A short synopsis"
|
||||
description: "A longer description"
|
||||
maintainer: ["Maintainer Name"]
|
||||
authors: ["Author Name"]
|
||||
license: "LICENSE"
|
||||
tags: ["topics" "to describe" "your" "project"]
|
||||
homepage: "https://github.com/username/reponame"
|
||||
doc: "https://url/to/documentation"
|
||||
bug-reports: "https://github.com/username/reponame/issues"
|
||||
depends: [
|
||||
"ocaml"
|
||||
"dune" {>= "3.16"}
|
||||
"odoc" {with-doc}
|
||||
]
|
||||
build: [
|
||||
["dune" "subst"] {dev}
|
||||
[
|
||||
"dune"
|
||||
"build"
|
||||
"-p"
|
||||
name
|
||||
"-j"
|
||||
jobs
|
||||
"@install"
|
||||
"@runtest" {with-test}
|
||||
"@doc" {with-doc}
|
||||
]
|
||||
]
|
||||
dev-repo: "git+https://github.com/username/reponame.git"
|
3
protocol/test/dune
Normal file
3
protocol/test/dune
Normal file
@ -0,0 +1,3 @@
|
||||
(test
|
||||
(libraries unix protocol)
|
||||
(name test_protocol))
|
1
protocol/test/test_protocol.ml
Normal file
1
protocol/test/test_protocol.ml
Normal file
@ -0,0 +1 @@
|
||||
|
Loading…
Reference in New Issue
Block a user