<?xml version="1.0" encoding="UTF-8"?>

<ruleset name="Error Prone"
         xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">

    <description>
        Rules to detect constructs that are either broken, extremely confusing or prone to runtime errors.
    </description>

    <rule name="ForceCast"
          language="swift"
          since="7.0.0"
          message="Force casts should be avoided."
          class="net.sourceforge.pmd.lang.rule.xpath.XPathRule"
          externalInfoUrl="${pmd.website.baseurl}/pmd_rules_swift_errorprone.html#forcecast">
        <description>
            Force casts should be avoided. This may lead to a crash if it's not used carefully.
            For example assuming a JSON property has a given type, or your reused Cell has a certain contract.
            Consider using conditional casting and handling the resulting optional.
        </description>
        <priority>3</priority>
        <properties>
            <property name="xpath">
                <value>
                    <![CDATA[
//TypeCastingOperator[T-as and T-bang]
]]>
                </value>
            </property>
        </properties>
        <example>
            <![CDATA[
NSNumber() as! Int // violation, force casting

NSNumber() as? Int // no violation
]]>
        </example>
    </rule>

    <rule name="ForceTry"
          language="swift"
          since="7.0.0"
          message="Force tries should be avoided."
          class="net.sourceforge.pmd.lang.rule.xpath.XPathRule"
          externalInfoUrl="${pmd.website.baseurl}/pmd_rules_swift_errorprone.html#forcetry">
        <description>
            Force tries should be avoided. If the code being wrapped happens to raise and exception, our application will crash.
            Consider using a conditional try and handling the resulting optional, or wrapping the try statement in a do-catch block.
        </description>
        <priority>3</priority>
        <properties>
            <property name="xpath">
                <value>
<![CDATA[
//TryOperator[T-bang]
]]>
                </value>
            </property>
        </properties>
        <example>
            <![CDATA[
let x = try! someThrowingFunction() // violation, force trying

let x = try? someThrowingFunction() // no violation
]]>
        </example>
    </rule>
</ruleset>
