import { _, RestOfLine, Newline, NumberValue, HexNumberValue, IdentifierValue } from "../primitives" import { Header } from "../shared" { const matchValue = require("match-value"); const mapAttributeFlags = require("../../map-attribute-flags"); } RootAttributes = header:Header attributesSection:AttributesSection Newline* { return { ...header, attributes: attributesSection } }; AttributesSection = AttributesSectionSATA / AttributesSectionNVMe AttributesSectionSATA = "=== START OF READ SMART DATA SECTION ===" Newline "SMART Attributes Data Structure revision number:" _ NumberValue Newline "Vendor Specific SMART Attributes with Thresholds:" Newline "ID#" _ "ATTRIBUTE_NAME" _ "FLAG" _ "VALUE" _ "WORST" _ "THRESH" _ "TYPE" _ "UPDATED" _ "WHEN_FAILED" _ "RAW_VALUE" Newline attributes:AttributeFieldSATA+ { return attributes; } AttributesSectionNVMe = "=== START OF SMART DATA SECTION ===" Newline "SMART/Health Information (NVMe Log 0x02)" Newline attributes:AttributeFieldNVMe+ { return attributes; } AttributeFlags = "0x" number:HexNumberValue { return mapAttributeFlags(number); } AttributeUpdatedWhen = "Always" / "Offline" AttributeFailedWhen = "FAILING_NOW" / "In_the_past" / "-" AttributeFieldType = "Pre-fail" / "Old_age" AttributeFieldSATA = _ id:NumberValue _ attributeName:IdentifierValue _ flags:AttributeFlags _ value:NumberValue _ worstValue:NumberValue _ threshold:NumberValue _ type:AttributeFieldType _ updatedWhen:AttributeUpdatedWhen _ failedWhen:AttributeFailedWhen _ rawValue:RestOfLine { return { id, attributeName, flags, value, worstValue, threshold, rawValue, updatedWhen: matchValue(updatedWhen, { "Always": "always", "Offline": "offline" }), type: matchValue(type, { "Pre-fail": "preFail", "Old_age": "oldAge" }), failingNow: (failedWhen === "FAILING_NOW"), /* TODO: Should the below include the FAILING_NOW state? */ failedBefore: (failedWhen === "In_the_past") }; } AttributeFieldNVMe = label:$[^:]+ ":" _ value:RestOfLine { return { label: label, value }; }