Embed Directive in D Programming Language

Here’s the translation of the Go code to D Programming Language, formatted in Markdown suitable for Hugo:

Our first program demonstrates embedding files and folders into the binary at build time. Here’s the full source code:

import std.stdio;
import std.file;

// In D, we don't have a direct equivalent to Go's embed directive.
// Instead, we can use string mixins or compile-time file reading.

// Read file contents at compile-time
enum fileString = import("folder/single_file.txt");

// Read file contents as bytes at compile-time
enum fileByte = cast(immutable(ubyte)[])import("folder/single_file.txt");

// For multiple files, we can use an associative array
enum folder = [
    "folder/single_file.txt": import("folder/single_file.txt"),
    "folder/file1.hash": import("folder/file1.hash"),
    "folder/file2.hash": import("folder/file2.hash")
];

void main()
{
    // Print out the contents of `single_file.txt`
    write(fileString);
    write(cast(string)fileByte);

    // Retrieve some files from the embedded folder
    write(folder["folder/file1.hash"]);
    write(folder["folder/file2.hash"]);
}

In D, we don’t have a direct equivalent to the embed directive. Instead, we use the import expression, which reads files at compile-time. This allows us to embed file contents directly into our executable.

To run this example, first create the necessary files:

$ mkdir -p folder
$ echo "hello d" > folder/single_file.txt
$ echo "123" > folder/file1.hash
$ echo "456" > folder/file2.hash

Then compile and run the D program:

$ dmd -run embed_example.d
hello d
hello d
123
456

In this D version:

  1. We use the import expression to read file contents at compile-time.
  2. For multiple files, we create an associative array with file paths as keys and their contents as values.
  3. The enum keyword is used to ensure these operations happen at compile-time.
  4. We don’t need to handle errors when reading files, as any issues will be caught at compile-time.

This approach embeds the file contents directly into the executable, achieving a similar result to Go’s embed directive.