We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Warning Check on Unused Parameter hides Error Check about Missing Parameter Type
*cfn-lint version: cfn-lint 0.25.3*

Parameters defined in a template, but not directly used, are not validated for missing attributes like `Type`.

For various reasons, we want to include parameters in our templates that are not used by resources in the templates and therefore disable `W2001` When this happens, the following template will not fail cfn-lint. If I uncomment the `Metadata` section, I will finally see the `E1012` failure. I should not have to resolve a Warning in order to unmask an Error.

```yaml
Parameters:
  Foo:
    Description: "Foo?"
Conditions:
  AlwaysFalse: !Equals [ true, false ]
Resources:
  # Metadata:
  #   Foo: !Ref Foo
  NullResource:
    Type: Custom::NullResource
    Condition: AlwaysFalse
```


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/cfnlint/rules/parameters/Configuration.py`
Content:
```
1 """
2 Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 SPDX-License-Identifier: MIT-0
4 """
5 from cfnlint.rules import CloudFormationLintRule
6 from cfnlint.rules import RuleMatch
7 
8 
9 class Configuration(CloudFormationLintRule):
10     """Check if Parameters are configured correctly"""
11     id = 'E2001'
12     shortdesc = 'Parameters have appropriate properties'
13     description = 'Making sure the parameters are properly configured'
14     source_url = 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html'
15     tags = ['parameters']
16 
17     valid_keys = [
18         'AllowedPattern',
19         'AllowedValues',
20         'ConstraintDescription',
21         'Default',
22         'Description',
23         'MaxLength',
24         'MaxValue',
25         'MinLength',
26         'MinValue',
27         'NoEcho',
28         'Type',
29     ]
30 
31     def match(self, cfn):
32         """Check CloudFormation Parameters"""
33 
34         matches = []
35 
36         for paramname, paramvalue in cfn.get_parameters().items():
37             for propname, _ in paramvalue.items():
38                 if propname not in self.valid_keys:
39                     message = 'Parameter {0} has invalid property {1}'
40                     matches.append(RuleMatch(
41                         ['Parameters', paramname, propname],
42                         message.format(paramname, propname)
43                     ))
44 
45         return matches
46
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/cfnlint/rules/parameters/Configuration.py b/src/cfnlint/rules/parameters/Configuration.py
--- a/src/cfnlint/rules/parameters/Configuration.py
+++ b/src/cfnlint/rules/parameters/Configuration.py
@@ -28,6 +28,10 @@
         'Type',
     ]
 
+    required_keys = [
+        'Type'
+    ]
+
     def match(self, cfn):
         """Check CloudFormation Parameters"""
 
@@ -41,5 +45,12 @@
                         ['Parameters', paramname, propname],
                         message.format(paramname, propname)
                     ))
+            for reqname in self.required_keys:
+                if reqname not in paramvalue.keys():
+                    message = 'Parameter {0} is missing required property {1}'
+                    matches.append(RuleMatch(
+                        ['Parameters', paramname],
+                        message.format(paramname, reqname)
+                    ))
 
         return matches

{"golden_diff": "diff --git a/src/cfnlint/rules/parameters/Configuration.py b/src/cfnlint/rules/parameters/Configuration.py\n--- a/src/cfnlint/rules/parameters/Configuration.py\n+++ b/src/cfnlint/rules/parameters/Configuration.py\n@@ -28,6 +28,10 @@\n         'Type',\n     ]\n \n+    required_keys = [\n+        'Type'\n+    ]\n+\n     def match(self, cfn):\n         \"\"\"Check CloudFormation Parameters\"\"\"\n \n@@ -41,5 +45,12 @@\n                         ['Parameters', paramname, propname],\n                         message.format(paramname, propname)\n                     ))\n+            for reqname in self.required_keys:\n+                if reqname not in paramvalue.keys():\n+                    message = 'Parameter {0} is missing required property {1}'\n+                    matches.append(RuleMatch(\n+                        ['Parameters', paramname],\n+                        message.format(paramname, reqname)\n+                    ))\n \n         return matches\n", "issue": "Warning Check on Unused Parameter hides Error Check about Missing Parameter Type\n*cfn-lint version: cfn-lint 0.25.3*\r\n\r\nParameters defined in a template, but not directly used, are not validated for missing attributes like `Type`.\r\n\r\nFor various reasons, we want to include parameters in our templates that are not used by resources in the templates and therefore disable `W2001` When this happens, the following template will not fail cfn-lint. If I uncomment the `Metadata` section, I will finally see the `E1012` failure. I should not have to resolve a Warning in order to unmask an Error.\r\n\r\n```yaml\r\nParameters:\r\n  Foo:\r\n    Description: \"Foo?\"\r\nConditions:\r\n  AlwaysFalse: !Equals [ true, false ]\r\nResources:\r\n  # Metadata:\r\n  #   Foo: !Ref Foo\r\n  NullResource:\r\n    Type: Custom::NullResource\r\n    Condition: AlwaysFalse\r\n```\r\n\n", "before_files": [{"content": "\"\"\"\nCopyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.\nSPDX-License-Identifier: MIT-0\n\"\"\"\nfrom cfnlint.rules import CloudFormationLintRule\nfrom cfnlint.rules import RuleMatch\n\n\nclass Configuration(CloudFormationLintRule):\n    \"\"\"Check if Parameters are configured correctly\"\"\"\n    id = 'E2001'\n    shortdesc = 'Parameters have appropriate properties'\n    description = 'Making sure the parameters are properly configured'\n    source_url = 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html'\n    tags = ['parameters']\n\n    valid_keys = [\n        'AllowedPattern',\n        'AllowedValues',\n        'ConstraintDescription',\n        'Default',\n        'Description',\n        'MaxLength',\n        'MaxValue',\n        'MinLength',\n        'MinValue',\n        'NoEcho',\n        'Type',\n    ]\n\n    def match(self, cfn):\n        \"\"\"Check CloudFormation Parameters\"\"\"\n\n        matches = []\n\n        for paramname, paramvalue in cfn.get_parameters().items():\n            for propname, _ in paramvalue.items():\n                if propname not in self.valid_keys:\n                    message = 'Parameter {0} has invalid property {1}'\n                    matches.append(RuleMatch(\n                        ['Parameters', paramname, propname],\n                        message.format(paramname, propname)\n                    ))\n\n        return matches\n", "path": "src/cfnlint/rules/parameters/Configuration.py"}], "after_files": [{"content": "\"\"\"\nCopyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.\nSPDX-License-Identifier: MIT-0\n\"\"\"\nfrom cfnlint.rules import CloudFormationLintRule\nfrom cfnlint.rules import RuleMatch\n\n\nclass Configuration(CloudFormationLintRule):\n    \"\"\"Check if Parameters are configured correctly\"\"\"\n    id = 'E2001'\n    shortdesc = 'Parameters have appropriate properties'\n    description = 'Making sure the parameters are properly configured'\n    source_url = 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html'\n    tags = ['parameters']\n\n    valid_keys = [\n        'AllowedPattern',\n        'AllowedValues',\n        'ConstraintDescription',\n        'Default',\n        'Description',\n        'MaxLength',\n        'MaxValue',\n        'MinLength',\n        'MinValue',\n        'NoEcho',\n        'Type',\n    ]\n\n    required_keys = [\n        'Type'\n    ]\n\n    def match(self, cfn):\n        \"\"\"Check CloudFormation Parameters\"\"\"\n\n        matches = []\n\n        for paramname, paramvalue in cfn.get_parameters().items():\n            for propname, _ in paramvalue.items():\n                if propname not in self.valid_keys:\n                    message = 'Parameter {0} has invalid property {1}'\n                    matches.append(RuleMatch(\n                        ['Parameters', paramname, propname],\n                        message.format(paramname, propname)\n                    ))\n            for reqname in self.required_keys:\n                if reqname not in paramvalue.keys():\n                    message = 'Parameter {0} is missing required property {1}'\n                    matches.append(RuleMatch(\n                        ['Parameters', paramname],\n                        message.format(paramname, reqname)\n                    ))\n\n        return matches\n", "path": "src/cfnlint/rules/parameters/Configuration.py"}]}