qrsimple-cli 1.0.0

Command line tool to generate QR codes.
Documentation
#!/usr/bin/env python3
import os
import re
import subprocess

def run_process(*args):
    process = subprocess.run(args)
    return process.returncode == 0

# chrono = "0.4.38"
# clap = { version = "4.5.4", features = ["cargo"] }

def modify_stream(reader, writer):
    depends = dict()
    section = False
    for line in reader:
        if re.search(r'^\[dependencies]$', line):
            print(line, end='', file=writer)
            section = True
        elif re.search(r'^\[', line):
            print(line, end='', file=writer)
            section = False
        elif section:
            if match := re.search(r'^([\w-]+) = "\d+\.\d+\.\d+"$', line):
                library, = match.groups()
                depends[library] = None
            elif match := re.search(r'^([\w-]+) = { version = "\d+\.\d+\.\d+", features = \["(\w+)"] }$', line):
                library, features = match.groups()
                depends[library] = features
            else:
                raise RuntimeError(f'Unexpected line: {line.rstrip()}')
        else:
            print(line, end='', file=writer)
    return depends

# noinspection PyShadowingNames
def modify_file(path):
    temp = path + '.___'
    try:
        with open(path, 'r') as reader:
            with open(temp, 'w') as writer:
                depends = modify_stream(reader, writer)
        os.remove(path)
        os.rename(temp, path)
        return depends
    except BaseException as error:
        try:
            os.remove(temp)
        except OSError:
            pass
        raise error

def add_depends(depends):
    for library, features in sorted(depends.items()):
        args = ['cargo', 'add', library]
        if features:
            args.extend(['--features', features])
        run_process(*args)

def run_main():
    depends = modify_file('Cargo.toml')
    add_depends(depends)

try:
    run_main()
except (OSError, RuntimeError) as error:
    print(error)
except KeyboardInterrupt:
    pass