cargo: Fall back to the checksum in Cargo.lock metadata table

In ansi_term-0.12.1 the packages do not have a checksum entry but it can
be found in the global metadata table.
diff --git a/mesonbuild/cargo/interpreter.py b/mesonbuild/cargo/interpreter.py
index 13568cd..33b9d60 100644
--- a/mesonbuild/cargo/interpreter.py
+++ b/mesonbuild/cargo/interpreter.py
@@ -751,13 +751,16 @@
                 # This is project's package, or one of its workspace members.
                 pass
             elif source == 'registry+https://github.com/rust-lang/crates.io-index':
+                checksum = package.get('checksum')
+                if checksum is None:
+                    checksum = cargolock['metadata'][f'checksum {name} {version} ({source})']
                 url = f'https://crates.io/api/v1/crates/{name}/{version}/download'
                 directory = f'{name}-{version}'
                 wraps.append(PackageDefinition.from_values(subp_name, subproject_dir, 'file', {
                     'directory': directory,
                     'source_url': url,
                     'source_filename': f'{directory}.tar.gz',
-                    'source_hash': package['checksum'],
+                    'source_hash': checksum,
                     'method': 'cargo',
                 }))
             elif source.startswith('git+'):
diff --git a/mesonbuild/cargo/manifest.py b/mesonbuild/cargo/manifest.py
index 183d91e..50c0489 100644
--- a/mesonbuild/cargo/manifest.py
+++ b/mesonbuild/cargo/manifest.py
@@ -242,3 +242,4 @@
 
     version: str
     package: T.List[CargoLockPackage]
+    metadata: T.Dict[str, str]