1
0
mirror of https://github.com/nicoverbruggen/phpmon.git synced 2025-08-07 03:50:08 +02:00
Files
app/phpmon/Modules/PHP Config Editor/Data/BytePhpPreference.swift
2023-09-13 18:13:51 +02:00

89 lines
2.6 KiB
Swift

//
// BytePhpPreference.swift
// PHP Monitor
//
// Created by Nico Verbruggen on 04/09/2023.
// Copyright © 2023 Nico Verbruggen. All rights reserved.
//
import Foundation
class BytePhpPreference: PhpPreference {
enum UnitOption: String, CaseIterable {
case kilobyte = "K"
case megabyte = "M"
case gigabyte = "G"
public var displayValue: String {
switch self {
case .kilobyte: return "KB"
case .megabyte: return "MB"
case .gigabyte: return "GB"
}
}
}
// MARK: Internal Values
var internalValue: String
var value: Int = 256 {
didSet { updatedFieldValue() }
}
var unit: UnitOption = .megabyte {
didSet { updatedFieldValue() }
}
override init(key: String) {
let value = Command.execute(
path: Paths.php, arguments: ["-r", "echo ini_get('\(key)');"],
trimNewlines: false
)
self.internalValue = value
if let (unit, value) = BytePhpPreference.readFrom(internalValue: self.internalValue) {
self.unit = unit
self.value = value
}
super.init(key: key)
}
// MARK: Save Value
private func updatedFieldValue() {
if value == -1 {
// In case we're dealing with unlimited value, we don't need a unit
internalValue = "-1"
} else {
// We need to append the unit otherwise
internalValue = "\(value)\(unit.rawValue)"
}
do {
try PhpPreference.persistToIniFile(key: self.key, value: self.internalValue)
Log.info("The preference \(key) was updated to: \(value)")
} catch {
Log.info("The preference \(key) could not be updated")
}
}
public static func readFrom(internalValue: String) -> (UnitOption, Int)? {
let pattern = "(-?\\d+)([KMG]?)"
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let range = NSRange(location: 0, length: internalValue.utf16.count)
if let match = regex.firstMatch(in: internalValue, options: [], range: range) {
let valueRange = match.range(at: 1)
let unitRange = match.range(at: 2)
if let value = Int(internalValue[Range(valueRange, in: internalValue)!]) {
let unitString = internalValue[Range(unitRange, in: internalValue)!] as String
return (UnitOption(rawValue: unitString) ?? UnitOption.kilobyte, value)
}
}
return nil
}
}