Contents

danielctull/FileBuilder

A declarative way to generate files using Swift.

Example

FileBuilder and TextBuilder take advantage of all the niceties provided by swift result builders, allowing inline for loops and if statements to build up a directory of files and files of text.

The following code creates a directory named “Generated Files” in a given parent directory. Then a text file is created for each number from 1 to 10 and a data file for numbers 3, 6 and 9. The contents of the text file is determined by whether the number is even or not.

func generate(in url: URL) throws {

    try Directory("Generated Files") {
        for i in (1...10) {

            TextFile("Number \(i).txt") {
                if i.isMultiple(of: 2) {
                    "This file is even-numbered."
                } else {
                    "This is an odd-numbered file."
                }
            }

            if i.isMultiple(of: 3) {
                DataFile("Number \(i).data", data: Data())
            }
        }
    }
    .write(in: url)
}

The following shows Finder with a “Generated Files” directory containing 10 text files and 3 data files.

["Image showing a directory called Generated Files with 6 text files and 6 data files inside."]

It is also possible to define File implementations to allow logic to be extracted and easier reasoning with large amounts of generation. The following code is equivalent to the code above with the text and data files broken out into their own types.

struct EvenOddTextFile: File {

    let number: Int

    var body: some File {
        TextFile("Number \(number).txt") {
            if number.isMultiple(of: 2) {
                "This file is even-numbered."
            } else {
                "This is an odd-numbered file."
            }
        }
    }
}

struct MultipleOfThreeDataFile: File {

    let number: Int

    var body: some File {
        if number.isMultiple(of: 3) {
            DataFile("Number \(i).data", data: Data())
        }
    }
}

func generate(in url: URL) throws {

    try Directory("Generated Files") {
        for i in (1...10) {
            EvenOddTextFile(number: i)
            MultipleOfThreeDataFile(number: i)
        }
    }
    .write(in: url)
}

Installation

You can add FileBuilder as a package dependency to an Xcode project.

https://github.com/danielctull/FileBuilder

To use FileBuilder in a Swift Package, add it to the dependencies clause in your Package.swift:

dependencies: [
  .package(url: "https://github.com/danielctull/FileBuilder", branch: "main")
]

Package Metadata

Repository: danielctull/FileBuilder

Stars: 8

Forks: 0

Open issues: 0

Default branch: main

Primary language: swift

License: BSD-3-Clause

Topics: file-generation, result-builder, swift

README: README.md