Exemplo n.º 1
0
        //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));
                });
            });
Exemplo n.º 2
0
        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);
                        }))
                                  );
                    });
Exemplo n.º 3
0
        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);
            }));
        }
Exemplo n.º 4
0
        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!");
                });
            });
Exemplo n.º 5
0
        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());
            }));
        }
Exemplo n.º 6
0
        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);
        }