В Swift, как сериализовать произвольный объект в формате Toml?

Спасибо за вашу помощь. Мне нужно взаимодействие с файлами Toml в моем приложении MacOS Swift. Я использую библиотеку TOMLDecoder для разбора формата Toml. Библиотека работает, указывая тип структуры Swift, который соответствует Codable, и библиотека создает объект для нас. Из документов:

struct Discography: Codable {
    struct Album: Codable {
       let name: String
       struct Song: Codable {
          let name: String
       }
       let songs: [Song]
    }
    let albums: [Album]
}

Если мы возьмем образец файла Toml:

[[albums]]
name = "Born to Run"

    [[albums.songs]]
    name = "Jungleland"

    [[albums.songs]]
    name = "Meeting Across the River"

[[albums]]
name = "Born in the USA"

  [[albums.songs]]
  name = "Glory Days"

  [[albums.songs]]
  name = "Dancing in the Dark"

Мы можем разобрать его с помощью:

let tomlData = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/file"))
let discography = try? TOMLDecoder().decode(Discography.self, from: tomlData)

Вот мой вопрос. Библиотека не предоставляет возможности обратить процесс, чтобы сериализовать обратно объект, поэтому я хотел бы написать это самостоятельно, и, возможно, я хотел бы добиться решения в чистом Swift, если я правильно понимаю, с помощью типа T, что позволяет сериализовать любой объект, соответствующий Codable. Функция декодирования в библиотеке:

public func decode<T: Decodable>(_ type: T.Type, from text: String) throws -> T {
    let topLevel: Any
    do {
        topLevel = try TOMLDeserializer.tomlTable(with: text)
    } catch {
        throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid TOML.", underlyingError: error))
    }

    let decoder = TOMLDecoderImpl(referencing: self, options: self.options)
    guard let value = try decoder.unbox(topLevel, as: type) else {
        throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: [], debugDescription: "The given data did not contain a top-level value."))
    }

    return value
}

Я начал писать свою функцию кодирования следующим образом:

class TOMLEncoder: TOMLDecoder {

    func encode<T>(sourceObject: T) -> String {
    
        return "Sample serialized text..."
    
    }

}

Я действительно не знаю, как действовать... исходя из моих очень ограниченных знаний, я должен как-то повторить свойства sourceObject и создать файл TOML из содержимого этих свойств, но я не уверен, что это правильный подход и как чтобы достичь этого. Любая помощь приветствуется. Спасибо


person Alfonso Tesauro    schedule 13.12.2020    source источник
comment
Взгляните (скажем) на stackoverflow.com/questions/45169254/, чтобы увидеть, что должен делать пользовательский кодировщик.   -  person matt    schedule 13.12.2020
comment
Вам нужен кодировщик, вам не нужен кодировщик для подкласса TOMLDecoder. Вышеупомянутая ссылка может быть источником вдохновения или оригинальным JSONEncoder: github.com/apple/swift/blob/main/stdlib/public/Darwin/   -  person Kiril S.    schedule 14.12.2020