import os
import re
import subprocess
def run_process(*args):
process = subprocess.run(args)
return process.returncode == 0
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
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