commandline: Add build_target argument type support.

Add support to automatically validate a build target name and parse
it into a BuildTarget object.

BUG=chromium:1059441
TEST=run_tests

Change-Id: Id6d2c463687b26b1272547f04a7954722ca1ef77
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2092491
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Chris McDonald <cjmcdonald@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
Tested-by: Alex Klein <saklein@chromium.org>
diff --git a/lib/build_target_util.py b/lib/build_target_util.py
index 7214b8f..c701c54 100644
--- a/lib/build_target_util.py
+++ b/lib/build_target_util.py
@@ -8,6 +8,7 @@
 from __future__ import print_function
 
 import os
+import re
 
 
 class Error(Exception):
@@ -39,7 +40,7 @@
     if build_root:
       self.root = os.path.normpath(build_root)
     else:
-      self.root = GetDefaultSysrootPath(self.name)
+      self.root = get_default_sysroot_path(self.name)
 
   def __eq__(self, other):
     if self.__class__ is other.__class__:
@@ -75,8 +76,15 @@
     """
     return '%s-%s' % (base_command, self.name)
 
-def GetDefaultSysrootPath(target_name):
-  if target_name:
-    return os.path.join('/build', target_name)
+
+def get_default_sysroot_path(build_target_name):
+  """Get the default sysroot path for a build target."""
+  if build_target_name:
+    return os.path.join('/build', build_target_name)
   else:
     raise InvalidNameError('Target name is required.')
+
+
+def is_valid_name(build_target_name):
+  """Validate |build_target_name| is a valid name."""
+  return bool(re.match(r'^[a-zA-Z0-9-_]+$', build_target_name))