I/O extensions for common tasks

Andrew Pennebaker andrew.pennebaker at gmail.com
Mon Dec 10 01:51:56 UTC 2018


The stdlib has all the low-level components we need to do lots of 
different workflows. However, there are a few gaps in the API in 
terms of high level, common tasks. For example, the API can read 
an entire Unicode text file to a string for a given filename, but 
not for a given File object!

For now, I am accomplishing this with:

// Convenience function for reading an entire UTF-8 file.
string readUTF8(File f) {
     string s;

     foreach(ubyte[] buf; f.byChunk(1024)) {
         s ~= buf;
     }

     return s;
}

Maybe not the best code, not much error handling and whatnot. 
Could we add something like this (but better code), to the 
standard lib?

Another little gap occurs when passing environment variables to 
process constructors, e.g. pipedProcess: There is no enum defined 
to represent the default case / NO redirects. For now, I am 
copying the raw source code here, using:

cast(Redirect)7

as mentioned on the pipeProcess page.

https://dlang.org/library/std/process/pipe_process.html

This is risky, as this magic value could change over time as the 
API evolves. Could we declare a stable enum name for the default 
case?

Another API improvement for process creation, that could be done 
independently of this enum work, would be to add keyword argument 
defaults, e.g. for pipeProcess(). I think this could be done 
without breaking backwards compatilbility. And it gives the user 
another way to set things like environment variables, while 
continuing to use the default values for the other fields. What 
do you think?


More information about the Digitalmars-d mailing list