From f890dc2701eb5f72b80e0c3efc96e3dcf26e001b Mon Sep 17 00:00:00 2001
From: Michael Zikeli <michael.zikeli@fau.de>
Date: Fri, 16 Feb 2024 14:09:56 +0100
Subject: [PATCH] Add an error to the parsing of precision and blending, to
 give the use a hint, what he actually wanted to do. And fix spacing.

---
 generate/generate.py | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/generate/generate.py b/generate/generate.py
index f7a91005..97ecddb8 100644
--- a/generate/generate.py
+++ b/generate/generate.py
@@ -3,7 +3,6 @@ from functools import partial
 import os
 import sys
 from typing import Any, Dict, List, Union
-from collections import defaultdict
 
 if sys.version_info >= (3, 11):
     import tomllib
@@ -189,6 +188,20 @@ def generate_operator(
         "IcosahedralShellMap": hfg.blending.IcosahedralShellMap(),
     }
 
+    def raise_exception(dict_key: Union[str, int]) -> None:
+        dict_arg = spec[f"{dict_key}"]
+        valid_options = []
+        if dict_key == "precision":
+            valid_options = [key for key in precisions.keys()]
+        elif dict_key == "blending":
+            valid_options = [key for key in blending_maps.keys()]
+
+        raise ValueError(
+            f"Something went wrong, "
+            f"the given value '{dict_arg}' is not a valid '{dict_key}'.\n"
+            f"{'' if not valid_options else str('Please choose one of these ' + str(valid_options) + '.')}"
+        )
+
     try:
         get_form = getattr(forms, form_str)
     except:
@@ -211,15 +224,19 @@ def generate_operator(
         for opt in spec["optimizations"]
     }
 
-    if "precision" not in spec:
-        # set default precision
-        spec["precision"] = "fp64"
-    type_descriptor = precisions[spec["precision"]]
+    type_descriptor = precisions["fp64"]  # set default precision
+    if "precision" in spec:
+        if spec["precision"] in precisions:
+            type_descriptor = precisions[spec["precision"]]
+        else:
+            raise_exception("precision")
 
-    if "blending" not in spec:
-        # set default blending
-        spec["blending"] = "IdentityMap"
-    blending = blending_maps[spec["blending"]]
+    blending = blending_maps["IdentityMap"]  # set default blending
+    if "blending" in spec:
+        if spec["blending"] in blending_maps:
+            blending = blending_maps[spec["blending"]]
+        else:
+            raise_exception("blending")
 
     kernel_types = [
         operator_generation.kernel_types.Apply(
-- 
GitLab