Generate core runtime API shims
This commit is contained in:
@@ -125,10 +125,10 @@ STDLIB = {
|
||||
"System.Net.IPAddress": "std::net::IpAddr",
|
||||
"System.Net.IPEndPoint": "std::net::SocketAddr",
|
||||
"System.Net.EndPoint": "std::net::SocketAddr",
|
||||
"System.Net.Http.HttpClient": "libremetaverse::http::Client",
|
||||
"System.Net.Http.HttpResponseMessage": "libremetaverse::http::Response",
|
||||
"System.Net.Http.HttpMethod": "libremetaverse::http::Method",
|
||||
"System.Net.Http.Headers.AuthenticationHeaderValue": "libremetaverse::http::Authentication",
|
||||
"System.Net.Http.HttpClient": "libremetaverse_types::compat::HttpClient",
|
||||
"System.Net.Http.HttpResponseMessage": "libremetaverse_types::compat::HttpResponse",
|
||||
"System.Net.Http.HttpMethod": "libremetaverse_types::compat::HttpMethod",
|
||||
"System.Net.Http.Headers.AuthenticationHeaderValue": "libremetaverse_types::compat::AuthenticationHeaderValue",
|
||||
"System.Net.Sockets.Socket": "libremetaverse::net::Socket",
|
||||
"System.Net.Sockets.TcpClient": "libremetaverse::net::TcpStream",
|
||||
"System.Net.Sockets.UdpClient": "libremetaverse::net::UdpSocket",
|
||||
@@ -167,6 +167,9 @@ SUPPORT_TYPES = {
|
||||
"LibreMetaverse.RLV.IBlacklistProvider": ("libremetaverse-rlv", "provider", "libremetaverse_rlv::provider::BlacklistProvider"),
|
||||
"LibreMetaverse.RLV.IRestrictionProvider": ("libremetaverse-rlv", "provider", "libremetaverse_rlv::provider::RestrictionProvider"),
|
||||
}
|
||||
MEMBER_RETURN_OVERRIDES = {
|
||||
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
|
||||
}
|
||||
RUST_KEYWORDS = {
|
||||
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn",
|
||||
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", "ref",
|
||||
@@ -501,7 +504,9 @@ class Mapper:
|
||||
target = substitute(target, mapped_arguments)
|
||||
if "<" not in target and not target.startswith("(") and target not in {"Ord", "Eq", "Clone", "std::fmt::Display"}:
|
||||
target += "<" + ", ".join(mapped_arguments) + ">"
|
||||
if base in self.interfaces:
|
||||
if base == "System.IDisposable":
|
||||
target = f"Box<dyn {target}>"
|
||||
elif base in self.interfaces or base == "System.IProgress":
|
||||
target = f"Box<dyn {target}>"
|
||||
for _ in re.findall(r"\[[,]*\]", suffix):
|
||||
target = f"Vec<{target}>"
|
||||
@@ -613,14 +618,16 @@ def member_signature(mapper: Mapper, owner: dict, item: dict, rust_name: str) ->
|
||||
return " ; ".join(pieces), ",".join([*self_ownership, *own]) or "none", asyncness, error_model, "accessor_methods"
|
||||
if kind == "event":
|
||||
event_type = mapper.type(item["type"], item.get("nullability"), generics)
|
||||
return f"pub fn subscribe_{rust_name}(&self, handler: {event_type}) -> Subscription", "stored_callback", asyncness, error_model, "subscription_guard"
|
||||
return f"pub fn subscribe_{rust_name}(&self, handler: {event_type}) -> libremetaverse_types::compat::Subscription", "stored_callback", asyncness, error_model, "subscription_guard"
|
||||
self_argument, self_ownership = method_receiver(owner, item)
|
||||
arguments = ", ".join(filter(None, [self_argument, parameters]))
|
||||
ownership = ",".join(([self_ownership] if self_ownership != "none" else []) + own) or "none"
|
||||
raw_return = item.get("type", "System.Void")
|
||||
return_type = mapper.type(raw_return, item.get("nullability"), generics)
|
||||
return_type = MEMBER_RETURN_OVERRIDES.get(
|
||||
item["doc_id"], mapper.type(raw_return, item.get("nullability"), generics)
|
||||
)
|
||||
if raw_return.startswith(("System.Threading.Tasks.Task", "System.Threading.Tasks.ValueTask")):
|
||||
asyncness = "async"
|
||||
asyncness = "boxed_future" if owner["kind"] == "interface" else "async"
|
||||
base, task_arguments, _ = type_parts(raw_return)
|
||||
child = item.get("nullability", {}).get("generic_arguments", [])
|
||||
return_type = mapper.type(task_arguments[0], child[0] if child else None, generics) if task_arguments else "()"
|
||||
@@ -642,6 +649,11 @@ def member_signature(mapper: Mapper, owner: dict, item: dict, rust_name: str) ->
|
||||
bounds.append("Default")
|
||||
generic_declarations.append(parameter["name"] + ((": " + " + ".join(bounds)) if bounds else ""))
|
||||
generic_suffix = "<" + ", ".join(generic_declarations) + ">" if generic_declarations else ""
|
||||
if asyncness == "boxed_future":
|
||||
return_type = (
|
||||
"std::pin::Pin<Box<dyn std::future::Future<Output = "
|
||||
f"{return_type}> + Send + '_>>"
|
||||
)
|
||||
prefix = "pub async fn" if asyncness == "async" else "pub fn"
|
||||
return f"{prefix} {rust_name}{generic_suffix}({arguments}) -> {return_type}", ownership, asyncness, error_model, "method"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user