//TODO: add detection & resolution of duplicate names public static TypeMember WebApiController(TypeMember middlewareType, WebApiMetadata api) => PUBLIC.CLASS(ID(api.InterfaceType.Name.TrimPrefixFragment("I"), "Controller"), () => { EXTENDS <Controller>(); ATTRIBUTE <RouteAttribute>("api/[controller]"); PRIVATE.READONLY.FIELD(api.InterfaceType, "_service", out var @serviceField); PUBLIC.CONSTRUCTOR(() => { PARAMETER(api.InterfaceType, "service", out var @service); @serviceField.ASSIGN(@service); }); api.ApiMethods.ForEach(apiMethod => { var requestClass = DataTransferObjectGenerator.MethodInvocation(apiMethod); PUBLIC.ASYNC.FUNCTION <Task <IActionResult> >(apiMethod.Name, () => { ATTRIBUTE(middlewareType); ATTRIBUTE <HttpPostAttribute>(apiMethod.Name.ToString(CasingStyle.Camel)); PARAMETER(requestClass, "requestData", out MethodParameter @requestData, () => { ATTRIBUTE <FromBodyAttribute>(); }); LOCAL(apiMethod.ReturnType.GenericArguments[0], "resultValue", out LocalVariable resultValueLocal); resultValueLocal.ASSIGN( AWAIT(THIS.DOT(@serviceField).DOT(apiMethod).INVOKE(() => { apiMethod.Signature.Parameters.ForEach(p => ARGUMENT(@requestData.DOT(p.Name.ToString(CasingStyle.Pascal)))); })) ); DO.RETURN(THIS.DOT("Json").INVOKE(resultValueLocal)); }); });
public static ModuleMember BackendApiService(WebApiMetadata api) => MODULE(new[] { "src", "services" }, ID(api.ServiceName, "Service"), () => { IMPORT.DEFAULT("axios", out var @axios).FROM("axios"); EXPORT.CLASS(ID(api.ServiceName, "Service"), () => { api.ApiMethods.ForEach(apiMethod => { var methodUrl = api.GetMethodUrl(apiMethod); //TODO: separate language-specific parts of fluent code DSL //For instance, 'PUBLIC' and 'PRIVATE' are not defined in JavaScript, and 'IMPORT' is not defined in C# PUBLIC.STATIC.FUNCTION(apiMethod.Name, () => { var arguments = apiMethod.Signature.Parameters.Select((parameter, index) => { PARAMETER(parameter.Name, out var @param); return(@param); }).ToList(); FINAL("data", out var @data, INITOBJECT(() => { arguments.ForEach(arg => KEY(arg.Name, arg)); })); DO.RETURN(@axios .DOT("post").INVOKE(ANY(methodUrl), @data) .DOT("then").INVOKE(LAMBDA(@result => DO.RETURN(@result.DOT("data")) )) .DOT("catch").INVOKE(LAMBDA(@err => { USE("console").DOT("log").INVOKE(@err); })) ); });
private void WritePageView() { FINAL("PageView", out var @ref, LAMBDA(() => { PARAMETER(TUPLE("model", out var @model)); PARAMETER("actions", out var @actions); var viewJsx = BuildViewJsx(@model, @actions); DO.RETURN(viewJsx != null ? XML(viewJsx) : (AbstractExpression)NULL); })); }
public static TypeMember Controller(WebApiMetadata api) => PUBLIC.CLASS($"{api.Interface.Name.TrimPrefix("I")}Controller", () => { EXTENDS<Controller>(); ATTRIBUTE<RouteAttribute>("api/[controller]"); PUBLIC.FUNCTION<string>("Index", () => { ATTRIBUTE<HttpGetAttribute>(); DO.RETURN("Hello World!"); }); });
private void WritePageActions() { FINAL("PageActions", out var @ref, INITOBJECT(() => { KEY("getState", LAMBDA(() => DO.RETURN(LAMBDA((@state, @actions) => DO.RETURN(@state))))); KEY("replaceModel", LAMBDA(@newModel => DO.RETURN(LAMBDA((@state, @actions) => DO.RETURN(INITOBJECT(("model", @newModel))) )) )); _components.ForEach(c => c.GenerateActionKeys()); })); }
protected XAttribute GenerateEventHandlerAttribute(AbstractExpression @actions, IdentifierName eventName) { var handlers = Metadata.EventMap.GetHandlers(eventName); if (handlers.Count > 0) { var attributeName = eventName.AppendPrefixFragments("on").ToString(CasingStyle.Camel); var actionKey = GetEventActionKeyName(eventName); return(new JsxExpressionAttribute( attributeName, LAMBDA(@data => DO.RETURN(@actions.DOT(actionKey).INVOKE(@data))))); } return(null); }