2024-09-30 22:31:07 +02:00

81 lines
2.5 KiB
Swift

//
// String.swift
// Adwaita
//
// Created by david-swift on 14.01.24.
//
extension String: @retroactive CodingKey {
/// The string.
public var stringValue: String {
self
}
/// A string cannot be represented as an integer.
public var intValue: Int? {
nil
}
/// Initialize from an int value.
/// - Parameter intValue: The int value.
public init?(intValue: Int) {
nil
}
/// Initialize from a string value.
/// - Parameter stringValue: The string value.
public init?(stringValue: String) {
self = stringValue
}
/// Generate a doc comment out of the string.
/// - Parameter indent: Indentation added at the beginning of every line.
/// - Returns: The comment.
func docComment(indent: String = "") -> String {
split(separator: "\n", omittingEmptySubsequences: false)
.map { $0.trimmingCharacters(in: .whitespaces) }
.enumerated()
.map { $0.offset == 0 ? $0.element.prefix(1).capitalized + $0.element.dropFirst() : $0.element }
.map { "\(indent)/// \($0)" }
.joined(separator: "\n")
}
/// Convert delimited to camel casing.
/// - Parameters:
/// - delimiter: The demiliter.
/// - unshorten: Whether to unshorten.
/// - configuration: The generation configuration.
/// - Returns: The string using camel casing.
func convertDelimitedCasingToCamel(
delimiter: Character,
configuration: GenerationConfiguration,
unshorten: Bool = false
) -> String {
var parts = split(separator: delimiter).map(String.init)
for (index, part) in parts.enumerated() {
if let replacement = configuration.unshorteningMap[part] {
parts[index] = replacement
}
}
let first = parts.removeFirst()
return first + parts.map(\.capitalized).joined()
}
/// Convert a C type to its Swift equivalent using the generation configuration.
/// - Parameter configuration: The generation configuration.
/// - Returns: The Swift type.
func convertCType(configuration: GenerationConfiguration) -> String {
if let replacement = configuration.cTypeReplacements[self] {
return replacement
}
var type = self
if type.last == "*" {
let pointeeType = String(type.dropLast()).convertCType(configuration: configuration)
type = "UnsafeMutablePointer<\(pointeeType)>!"
}
return type
}
}