Skip to content

Commit

Permalink
Improve readability in implementation of interface to host
Browse files Browse the repository at this point in the history
+ Remove mappings from old names around the volatile process.
+ Simplify C# code with the new record syntax.
  • Loading branch information
Viir committed Aug 24, 2021
1 parent f325066 commit 7868790
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 335 deletions.
10 changes: 5 additions & 5 deletions implement/elm-fullstack/ElmFullstack/ElmAppCompilation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,11 +152,11 @@ IImmutableDictionary<IImmutableList<string>, IReadOnlyList<byte>> compileNew()
var otherErrorsText =
string.Join("\n", otherErrors.Select(DescribeCompilationError));

/*
* TODO: To clean up the appearance in the (CL) user interface, avoid burying the error message in a large stack trace:
* Propagate the errors further without runtime exception.
* New C# features might help simplify the syntax to implement this so that implementation might be easier after switching to .NET 6.
* Until then, add line breaks to the message to help spot this within a larger output.
/*
* TODO: To clean up the appearance in the (CL) user interface, avoid burying the error message in a large stack trace:
* Propagate the errors further without runtime exception.
* New C# features might help simplify the syntax to implement this so that implementation might be easier after switching to .NET 6.
* Until then, add line breaks to the message to help spot this within a larger output.
* */

throw new Exception("Failed compilation with " + compilationErrors.Count + " errors:\n" + otherErrorsText + "\n\n");
Expand Down
264 changes: 35 additions & 229 deletions implement/elm-fullstack/ElmFullstack/InterfaceToHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,107 +2,36 @@

namespace ElmFullstack.InterfaceToHost
{
public class AppEventStructure
{
public ArrivedAtTimeEventStructure ArrivedAtTimeEvent;
public record AppEventStructure(
ArrivedAtTimeEventStructure ArrivedAtTimeEvent = null,
HttpRequestEvent HttpRequestEvent = null,
ResultFromTaskWithId TaskCompleteEvent = null);

public HttpRequestEvent HttpRequestEvent;
public record ResponseOverSerialInterface(string DecodeEventError = null, AppEventResponseStructure DecodeEventSuccess = null);

public ResultFromTaskWithId TaskCompleteEvent;
}
public record AppEventResponseStructure(
NotifyWhenPosixTimeHasArrivedRequestStructure notifyWhenPosixTimeHasArrived,
StartTask[] startTasks,
HttpResponseRequest[] completeHttpResponses);

public class ResponseOverSerialInterface
{
public string DecodeEventError;
public record HttpRequestEvent(Int64 posixTimeMilli, string httpRequestId, HttpRequestContext requestContext, HttpRequest request);

public AppEventResponseStructure DecodeEventSuccess;
}
public record HttpRequestContext(string clientAddress);

public class AppEventResponseStructure
{
public NotifyWhenArrivedAtTimeRequestStructure notifyWhenArrivedAtTime;
public record HttpRequest(string method, string uri, string bodyAsBase64, HttpHeader[] headers);

public NotifyWhenPosixTimeHasArrivedRequestStructure notifyWhenPosixTimeHasArrived;
public record HttpHeader(string name, string[] values);

public StartTask[] startTasks;
public record HttpResponseRequest(string httpRequestId, HttpResponse response);

public HttpResponseRequest[] completeHttpResponses;
}
public record HttpResponse(int statusCode, string bodyAsBase64, HttpHeader[] headersToAdd);

public class HttpRequestEvent
{
public Int64 posixTimeMilli;

public string httpRequestId;

public HttpRequestContext requestContext;

public HttpRequest request;
}
public record ArrivedAtTimeEventStructure(Int64 posixTimeMilli);

public class HttpRequestContext
{
public string clientAddress;
}

public class HttpRequest
{
public string method;

public string uri;

public string bodyAsBase64;

public HttpHeader[] headers;
}

public class HttpHeader
{
public string name;

public string[] values;
}

public class HttpResponseRequest
{
public string httpRequestId;

public HttpResponse response;
}

public class HttpResponse
{
public int statusCode;

public string bodyAsBase64;

public HttpHeader[] headersToAdd;
}

public class ArrivedAtTimeEventStructure
{
public Int64 posixTimeMilli;
}

/// <summary>
/// TODO: Clean up: Remove NotifyWhenArrivedAtTimeRequestStructure
/// </summary>
public class NotifyWhenArrivedAtTimeRequestStructure
{
public Int64 posixTimeMilli;
}

public class NotifyWhenPosixTimeHasArrivedRequestStructure
{
public Int64 minimumPosixTimeMilli;
}
public record NotifyWhenPosixTimeHasArrivedRequestStructure(Int64 minimumPosixTimeMilli);

public class Result<ErrT, OkT>
public record Result<ErrT, OkT>(ErrT Err = default, OkT Ok = default)
{
public ErrT Err;

public OkT Ok;

public Result<ErrT, NewOkT> map<NewOkT>(Func<OkT, NewOkT> mapOk) =>
Ok != null ?
new Result<ErrT, NewOkT> { Ok = mapOk(Ok) }
Expand All @@ -116,154 +45,31 @@ public Result<NewErrT, OkT> mapErr<NewErrT>(Func<ErrT, NewErrT> mapError) =>
new Result<NewErrT, OkT> { Err = mapError(Err) };
}

public class ResultFromTaskWithId
{
public string taskId;

public TaskResult taskResult;
}

public class TaskResult
{
public Result<CreateVolatileHostErrorStructure, CreateVolatileHostComplete> CreateVolatileHostResponse;

public Result<RequestToVolatileHostError, RequestToVolatileHostComplete> RequestToVolatileHostResponse;

public Result<CreateVolatileProcessErrorStructure, CreateVolatileProcessComplete> CreateVolatileProcessResponse;

public Result<RequestToVolatileProcessError, RequestToVolatileProcessComplete> RequestToVolatileProcessResponse;

public object CompleteWithoutResult;

/*
* TODO: Clean up: Remove CreateVolatileHostErrorStructure, CreateVolatileHostComplete, RequestToVolatileHostError, RequestToVolatileHostComplete
* */

public class CreateVolatileHostErrorStructure
{
public string exceptionToString;
}

public class CreateVolatileHostComplete
{
public string hostId;

public CreateVolatileHostComplete(CreateVolatileProcessComplete complete)
{
hostId = complete.processId;
}
}

public class RequestToVolatileHostError
{
public object HostNotFound;

public RequestToVolatileHostError(RequestToVolatileProcessError error)
{
HostNotFound = error.ProcessNotFound;
}
}

public class RequestToVolatileHostComplete
{
public string exceptionToString;

public string returnValueToString;

public long durationInMilliseconds;

public RequestToVolatileHostComplete(RequestToVolatileProcessComplete complete)
{
exceptionToString = complete.exceptionToString;
returnValueToString = complete.returnValueToString;
durationInMilliseconds = complete.durationInMilliseconds;
}
}

public class CreateVolatileProcessErrorStructure
{
public string exceptionToString;
}

public class CreateVolatileProcessComplete
{
public string processId;
}

public class RequestToVolatileProcessError
{
public object ProcessNotFound;
}

public class RequestToVolatileProcessComplete
{
public string exceptionToString;

public string returnValueToString;

public long durationInMilliseconds;
}
}

public class StartTask
{
public string taskId;

public Task task;
}

public class Task
{
public CreateVolatileHostStructure CreateVolatileHost;

public RequestToVolatileHostStructure RequestToVolatileHost;
public record ResultFromTaskWithId(string taskId, TaskResult taskResult);

public ReleaseVolatileHostStructure ReleaseVolatileHost;
public record TaskResult(
Result<CreateVolatileProcessErrorStructure, CreateVolatileProcessComplete> CreateVolatileProcessResponse = null,
Result<RequestToVolatileProcessError, RequestToVolatileProcessComplete> RequestToVolatileProcessResponse = null,
object CompleteWithoutResult = null);

public record CreateVolatileProcessErrorStructure(string exceptionToString);

public CreateVolatileProcessStruct CreateVolatileProcess;
public record CreateVolatileProcessComplete(string processId);

public RequestToVolatileProcessStruct RequestToVolatileProcess;
public record RequestToVolatileProcessError(object ProcessNotFound);

public TerminateVolatileProcessStruct TerminateVolatileProcess;
public record RequestToVolatileProcessComplete(string exceptionToString, string returnValueToString, long durationInMilliseconds);

/*
* TODO: Clean up after migrating apps in production: Remove CreateVolatileHostStructure, RequestToVolatileHostStructure, ReleaseVolatileHostStructure
*
* */
public record StartTask(string taskId, Task task);

public class CreateVolatileHostStructure
{
public string script;
}
public record Task(
CreateVolatileProcessStruct CreateVolatileProcess = null,
RequestToVolatileProcessStruct RequestToVolatileProcess = null,
TerminateVolatileProcessStruct TerminateVolatileProcess = null);

public class RequestToVolatileHostStructure
{
public string hostId;
public record CreateVolatileProcessStruct(string programCode);

public string request;
}
public record RequestToVolatileProcessStruct(string processId, string request);

public class ReleaseVolatileHostStructure
{
public string hostId;
}

public class CreateVolatileProcessStruct
{
public string programCode;
}

public class RequestToVolatileProcessStruct
{
public string processId;

public string request;
}

public class TerminateVolatileProcessStruct
{
public string processId;
}
}
public record TerminateVolatileProcessStruct(string processId);
}
14 changes: 7 additions & 7 deletions implement/elm-fullstack/WebHost/Asp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ static RateLimitMutableContainer BuildRateLimitContainerForClient(WebAppConfigur
{
var httpHeaders =
httpRequest.Headers
.Select(header => new InterfaceToHost.HttpHeader { name = header.Key, values = header.Value.ToArray() })
.Select(header => new InterfaceToHost.HttpHeader(name: header.Key, values: header.Value.ToArray()))
.ToArray();

byte[] httpRequestBody = null;
Expand All @@ -90,12 +90,12 @@ static RateLimitMutableContainer BuildRateLimitContainerForClient(WebAppConfigur
}

return new InterfaceToHost.HttpRequest
{
method = httpRequest.Method,
uri = httpRequest.GetDisplayUrl(),
bodyAsBase64 = httpRequestBody == null ? null : Convert.ToBase64String(httpRequestBody),
headers = httpHeaders,
};
(
method: httpRequest.Method,
uri: httpRequest.GetDisplayUrl(),
bodyAsBase64: httpRequestBody == null ? null : Convert.ToBase64String(httpRequestBody),
headers: httpHeaders
);
}
}
}
Loading

0 comments on commit 7868790

Please sign in to comment.