1*90277196SAndroid Build Coastguard Worker"""Utility functions not closely tied to other spec_tools types.""" 2*90277196SAndroid Build Coastguard Worker# Copyright (c) 2018-2019 Collabora, Ltd. 3*90277196SAndroid Build Coastguard Worker# Copyright 2013-2024 The Khronos Group Inc. 4*90277196SAndroid Build Coastguard Worker# 5*90277196SAndroid Build Coastguard Worker# SPDX-License-Identifier: Apache-2.0 6*90277196SAndroid Build Coastguard Worker 7*90277196SAndroid Build Coastguard Worker 8*90277196SAndroid Build Coastguard Workerdef getElemName(elem, default=None): 9*90277196SAndroid Build Coastguard Worker """Get the name associated with an element, either a name child or name attribute.""" 10*90277196SAndroid Build Coastguard Worker name_elem = elem.find('name') 11*90277196SAndroid Build Coastguard Worker if name_elem is not None: 12*90277196SAndroid Build Coastguard Worker return name_elem.text 13*90277196SAndroid Build Coastguard Worker # Fallback if there is no child. 14*90277196SAndroid Build Coastguard Worker return elem.get('name', default) 15*90277196SAndroid Build Coastguard Worker 16*90277196SAndroid Build Coastguard Worker 17*90277196SAndroid Build Coastguard Workerdef getElemType(elem, default=None): 18*90277196SAndroid Build Coastguard Worker """Get the type associated with an element, either a type child or type attribute.""" 19*90277196SAndroid Build Coastguard Worker type_elem = elem.find('type') 20*90277196SAndroid Build Coastguard Worker if type_elem is not None: 21*90277196SAndroid Build Coastguard Worker return type_elem.text 22*90277196SAndroid Build Coastguard Worker # Fallback if there is no child. 23*90277196SAndroid Build Coastguard Worker return elem.get('type', default) 24*90277196SAndroid Build Coastguard Worker 25*90277196SAndroid Build Coastguard Worker 26*90277196SAndroid Build Coastguard Workerdef findFirstWithPredicate(collection, pred): 27*90277196SAndroid Build Coastguard Worker """Return the first element that satisfies the predicate, or None if none exist. 28*90277196SAndroid Build Coastguard Worker 29*90277196SAndroid Build Coastguard Worker NOTE: Some places where this is used might be better served by changing to a dictionary. 30*90277196SAndroid Build Coastguard Worker """ 31*90277196SAndroid Build Coastguard Worker for elt in collection: 32*90277196SAndroid Build Coastguard Worker if pred(elt): 33*90277196SAndroid Build Coastguard Worker return elt 34*90277196SAndroid Build Coastguard Worker return None 35*90277196SAndroid Build Coastguard Worker 36*90277196SAndroid Build Coastguard Worker 37*90277196SAndroid Build Coastguard Workerdef findNamedElem(elems, name): 38*90277196SAndroid Build Coastguard Worker """Traverse a collection of elements with 'name' nodes or attributes, looking for and returning one with the right name. 39*90277196SAndroid Build Coastguard Worker 40*90277196SAndroid Build Coastguard Worker NOTE: Many places where this is used might be better served by changing to a dictionary. 41*90277196SAndroid Build Coastguard Worker """ 42*90277196SAndroid Build Coastguard Worker return findFirstWithPredicate(elems, lambda elem: getElemName(elem) == name) 43*90277196SAndroid Build Coastguard Worker 44*90277196SAndroid Build Coastguard Worker 45*90277196SAndroid Build Coastguard Workerdef findTypedElem(elems, typename): 46*90277196SAndroid Build Coastguard Worker """Traverse a collection of elements with 'type' nodes or attributes, looking for and returning one with the right typename. 47*90277196SAndroid Build Coastguard Worker 48*90277196SAndroid Build Coastguard Worker NOTE: Many places where this is used might be better served by changing to a dictionary. 49*90277196SAndroid Build Coastguard Worker """ 50*90277196SAndroid Build Coastguard Worker return findFirstWithPredicate(elems, lambda elem: getElemType(elem) == typename) 51*90277196SAndroid Build Coastguard Worker 52*90277196SAndroid Build Coastguard Worker 53*90277196SAndroid Build Coastguard Workerdef findNamedObject(collection, name): 54*90277196SAndroid Build Coastguard Worker """Traverse a collection of elements with 'name' attributes, looking for and returning one with the right name. 55*90277196SAndroid Build Coastguard Worker 56*90277196SAndroid Build Coastguard Worker NOTE: Many places where this is used might be better served by changing to a dictionary. 57*90277196SAndroid Build Coastguard Worker """ 58*90277196SAndroid Build Coastguard Worker return findFirstWithPredicate(collection, lambda elt: elt.name == name) 59