Files
swift-mirror/stdlib/private/OSLog/OSLogStringAlignment.swift
Josh Learn 1fd6ef95ce [OSLog] Update compiler stubs and tests
The compiler stubs for testing the OSLog implementation are in need of an update. This change updates the stubs to be consistent with the current OSLog implementation, updates the existing tests, and adds new tests for String and metatype interpolations.

rdar://69719729
2020-10-01 12:14:08 -07:00

88 lines
3.0 KiB
Swift

//===----------------- OSLogStringAlignment.swift -------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// This file defines types and functions for specifying alignment of the
// interpolations passed to the os log APIs.
@usableFromInline
internal enum OSLogCollectionBound {
case start
case end
}
@frozen
public struct OSLogStringAlignment {
/// Minimum number of characters to be displayed. If the value to be printed
/// is shorter than this number, the result is padded with spaces. The value
/// is not truncated even if the result is larger. This value need not be a
/// compile-time constant, and is therefore an autoclosure.
@usableFromInline
internal var minimumColumnWidth: (() -> Int)?
/// This captures right/left alignment.
@usableFromInline
internal var anchor: OSLogCollectionBound
/// Initiailzes stored properties.
///
/// - Parameters:
/// - minimumColumnWidth: Minimum number of characters to be displayed. If the value to be
/// printed is shorter than this number, the result is padded with spaces. The value is not truncated
/// even if the result is larger.
/// - anchor: Use `.end` for right alignment and `.start` for left.
@_transparent
@usableFromInline
internal init(
minimumColumnWidth: (() -> Int)? = nil,
anchor: OSLogCollectionBound = .end
) {
self.minimumColumnWidth = minimumColumnWidth
self.anchor = anchor
}
/// Indicates no alignment.
@_semantics("constant_evaluable")
@inlinable
@_optimize(none)
public static var none: OSLogStringAlignment { OSLogStringAlignment(anchor: .end) }
/// Right align and display at least `columns` characters.
///
/// The interpolated value would be padded with spaces, if necessary, to
/// meet the specified `columns` characters.
///
/// - Parameter columns: minimum number of characters to display.
@_semantics("constant_evaluable")
@inlinable
@_optimize(none)
public static func right(
columns: @escaping @autoclosure () -> Int
) -> OSLogStringAlignment {
OSLogStringAlignment(minimumColumnWidth: columns, anchor: .end)
}
/// Left align and display at least `columns` characters.
///
/// The interpolated value would be padded with spaces, if necessary, to
/// meet the specified `columns` characters.
///
/// - Parameter columns: minimum number of characters to display.
@_semantics("constant_evaluable")
@inlinable
@_optimize(none)
public static func left(
columns: @escaping @autoclosure () -> Int
) -> OSLogStringAlignment {
OSLogStringAlignment(minimumColumnWidth: columns, anchor: .start)
}
}