code: def main():
    
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description=generate_help())
  
    subparsers = parser.add_subparsers()
  
    for registered_recipe in config.Config.get_registered_recipes():
      recipe, recipe_args, documentation = registered_recipe
      subparser = subparsers.add_parser(
          recipe['name'],
          formatter_class=utils.DFTimewolfFormatterClass,
          description='{0:s}'.format(documentation))
      subparser.set_defaults(recipe=recipe)
      for switch, help_text, default in recipe_args:
        subparser.add_argument(switch, help=help_text, default=default)
      # Override recipe defaults with those specified in Config
      # so that they can in turn be overridden in the commandline
      subparser.set_defaults(**config.Config.get_extra())
  
    args = parser.parse_args()
    recipe = args.recipe
  
    state = DFTimewolfState(config.Config)
    print('Loading recipes...')
    state.load_recipe(recipe)
    print('Loaded recipe {0:s} with {1:d} modules'.format(
        recipe['name'], len(recipe['modules'])))
  
    print('Setting up modules...')
    state.setup_modules(args)
    print('Modules successfully set up!')
  
    print('Running modules...')
    state.run_modules()
    print('Recipe {0:s} executed successfully.'.format(recipe['name']))
docs: Main function for DFTimewolf.