Search code examples
ceylon

Writing an if statement in Ceylon


I have tasked myself with writing a file writer in Ceylon and in the process of doing so I have been hit by the crushing difficulty of writing an if statement in Ceylon, that will be allowed to pass when facing the mighty Wizard of Type Correctness on the narrow Bridge of Compilation in the far far land of Ceylon:

The error I get is "Error:(10, 1) ceylon: incorrect syntax: missing EOF at 'if'"

This is my if statement (the first line is line 10):

if (is Nil fileResource || is File fileResource) {
    File file = createFileIfNil(fileResource);
    value writer = file.Overwriter();
    //writer.writeLine("Hello, World!");
} else {
    print("hello");
}

EDIT: this is my if statement updated according to Bastien Jansens recommendation. The error, however, remains the same :(

Path folderPath = parsePath("""C:\Users\Jon\Auchitect\POSTtoFile""");
Path filePath = folderPath.childPath("BPset.json.txt");
FResource fileResource = filePath.resource;
if (is Nil|File fileResource) {
    File file = createFileIfNil(fileResource);
    value writer = file.Overwriter();
    //writer.writeLine("Hello, World!");
} else {
    print("hello");
}

This is the full source code of my application:

import ceylon.http.server { newServer, startsWith, Endpoint, Request, Response }
import ceylon.io { SocketAddress }
import ceylon.file { Path, parsePath, File, createFileIfNil, FResource = Resource }


// let's create a file with "hello world":
Path folderPath = parsePath("""C:\Users\Jon\Auchitect\POSTtoFile""");
Path filePath = folderPath.childPath("BPset.json.txt");
FResource fileResource = filePath.resource;
if (is Nil|File fileResource) {
    File file = createFileIfNil(fileResource);
    value writer = file.Overwriter();
    //writer.writeLine("Hello, World!");
} else {
    print("hello");
}



shared void runServer() {

    //create a HTTP server
    value server = newServer {
        //an endpoint, on the path /hello
            Endpoint {
                path = startsWith("/postBPset");
                //handle requests to this path
                function service(Request request, Response response) {
                    variable String logString;
                    variable String jsonString;
                    variable String contentType;
                    contentType = request.contentType
                        else "(not specified)";
                    logString = "Received " + request.method.string + " request \n"
                    + "Content type: " + contentType + "\n"
                    + "Request method: " + request.method.string + "\n";
                    jsonString = request.read();
                    print(logString);
                    return response;
                }

            }
    };

    //start the server on port 8080
    server.start(SocketAddress("127.0.0.1",8080));

}

Solution

  • The || operator cannot be used in conjunction with if (is ...), the correct way to achieve what you want is using a union type:

    if (is Nil|File fileResource) {
        ...
    }
    

    || would be valid in the following syntax, but you would lose the refinement (it would only be a boolean expression, not a type refinement):

    if (fileResource is Nil || fileResource is File ) {
        ...
    }
    

    The || operator only works on Boolean expressions (which foo is Bar is), whereas is Bar foo is a Boolean condition, which is a different construct. The same applies for exists conditions vs exists operators.

    EDIT: oh, and of course you need to put that if statement in a function, toplevel elements can only be declarations (classes, functions or values, if statements are not allowed).