def prompt_create_record(datacls: type, message_header: str = '', asdict=False): assert hasattr(datacls, '__dataclass_fields__' ), 'Must input a dataclass in order to use this prompt' message_header = message_header or f'Please input the field values to create a new {datacls.__name__}' result_values = { name: field.default for name, field in datacls.__dataclass_fields__.items() } fields_by_index = picklist_to_dict(datacls.__dataclass_fields__) def prompt_single_field(index): field = fields_by_index[index] validator = validator = PromptConfigureObjectValidator( datacls, fields_by_index, result_values, preselected_field_index=index) completer = PromptConfigureObjectCompleter( datacls, fields_by_index, result_values, preselected_field_index=index) value = prompt_v2(f'Set value for {cyan(field.name)}:', validator=validator, completer=completer, validate_while_typing=False) result_values[field.name] = _cast(value, field.type) while True: message = _configure_object_format_message(message_header, datacls, result_values) validator = PromptConfigureObjectValidator(datacls, fields_by_index, result_values) completer = PromptConfigureObjectCompleter(datacls, fields_by_index, result_values) field_selection, value = prompt_v2(message, _configure_object_unpack_input, validator=validator, completer=completer, validate_while_typing=False) if field_selection == '': break if field_selection == '0': for index, field in fields_by_index.items(): prompt_single_field(index) continue if field_selection and value is None: prompt_single_field(field_selection) continue field = fields_by_index[field_selection] result_values[field.name] = _cast(value, field.type) new_record = datacls(**result_values) if asdict: return _asdict(new_record) return new_record
def asdict(obj: Any) -> dict: """Coerce a dataclass object to a dict.""" return {key: value for key, value in _asdict(obj).items()}
def asdict(self): return _asdict(self)
def __iter__(self): for k, v in _asdict(self).items(): if isinstance(v, _Path): v = str(v) yield k, v